Вот некоторый код, который генерирует список data.frame
s, а затем преобразует этот исходный список в новый список, где каждый элемент списка представляет собой список строк каждого фрейма данных.
Например.
- l1
имеет длину 10, и каждый элемент представляет собой data.frame
с 1000 строками.
- l2
— это список длиной 1000 (nrow(l1[[k]])
), а каждый элемент — это list
длины 10 (length(l1)
), содержащий векторы-строки из элементов l1
l1 <- vector("list", length= 10)
set.seed(65L)
for (i in 1:10) {
l1[[i]] <- data.frame(matrix(rnorm(10000),ncol=10))
}
l2 <- vector(mode="list", length= nrow(l1[[1]]))
for (i in 1:nrow(l1[[1]])) {
l2[[i]] <- lapply(l1, function(l) return(unlist(l[i,])))
}
Изменить Чтобы прояснить, как l1
относится к l2
, вот код, не зависящий от языка.
for (j in 1:length(l1) {
for (i in 1:nrow(l1[[1]]) { # where nrow(l1[[1]]) == nrow(l1[[k]]) k= 2,...,10
l2[[i]][[j]] <- l1[[j]][i,]
}
}
Как мне ускорить создание l2
с помощью векторизации или распараллеливания? Проблема, с которой я столкнулся, заключается в том, что parallel::parLapplyLB
разбивает списки; однако я не хочу разбивать список l1
, я хочу разделить строки в каждом элементе l1
. Промежуточное решение векторизовало бы мой текущий подход, используя некоторую функцию *apply
для замены цикла for. Это, очевидно, может быть распространено и на параллельное решение.
Если я решу это самостоятельно до того, как будет найдено приемлемое решение, я опубликую свой ответ здесь.
l1[[i]] <- ...
) или простоl1 = replicate(10, data.frame(matrix(rnorm(10000), ncol = 10)), simplify = F)
- person Gregor Thomas   schedule 11.03.2016l1
будет иметь одинаковое количество строк, но не одинаковое количество столбцов. - person Alex W   schedule 11.03.2016l1
на составляющие его строки. Таким образом, вместо списка длиной 10, где каждый элемент имеет 1000 строк, у меня есть список длиной 1000, где каждый элемент представляет собой список длиной 10. - person Alex W   schedule 11.03.2016l2[[2]][[3]] <- l1[[3]][2,]
(правильно?) - person Tensibai   schedule 11.03.2016