Есть ли способ суммировать списки фреймов данных в большом списке? - PullRequest
2 голосов
/ 21 января 2020

У меня большой список (z), содержащий 3 списка из 10 фреймов данных. Я хотел бы свернуть этот объект в список из 3 кадров данных, где каждый кадр данных является суммой 10 предыдущих кадров данных (подумайте о сложении матрицы). Вот с чем я работаю, имейте в виду, что это фальшивые числа, поскольку реальные данные считываются из сотен * .csv файлов

x = rep(1,100)
x = matrix(x,10,10)
x = as.data.frame(x)
y = list(x,x,x,x,x,x,x,x,x,x)
z = list(y,y,y)  

Желаемый конечный продукт будет выглядеть следующим образом:

x1 = rep(10,100)
x1 = matrix(x,10,10)
y1 = list(x1,x1,x1)

Я продолжаю пробовать что-то вроде:

z1 = c()
for (i in 1:3){
  for (j in 1:10){
    z1[[i]] = sum(z[[i]][[j]])
  }
  }

Однако это не дает желаемого результата. Я также возился с некоторыми функциями apply, но безрезультатно

Заранее благодарен за помощь!

1 Ответ

2 голосов
/ 21 января 2020

Мы можем использовать Reduce для суммирования соответствующих элементов i, j в list и свернуть их в один набор данных

lapply(z, function(x) Reduce(`+`, x))

Если мы хотим удалить последний столбец, который не является числовым c

lapply(z, function(x) Reduce(`+`, lapply(x, function(y) y[-ncol(y)])))

Или это может быть зациклено по последовательности list

lapply(seq_along(z), function(i) Reduce(`+`, lapply(seq_along(z[[i]]), 
          function(j) z[[i]][[j]][-ncol(z[[i]][[j]])])))

Если мы хотим использовать sum, data.frame s внутри list можно преобразовать в array, l oop над array с помощью apply, указать MARGIN и сделать sum. В этом варианте также есть возможность позаботиться о NA элементах с na.rm = TRUE в sum

lapply(z, function(x) apply(array(unlist(x), c(10, 10, 10)),
        1:2, sum, na.rm = TRUE))

или сделать его более эффективным, зацикливаясь только на одном измерении и используя colSums

lapply(z, function(x) apply(array(unlist(x), c(10, 10, 10)), 1, colSums, na.rm = TRUE))

Или используя for l oop

z1 <- replicate(length(z), matrix(0, 10, 10), simplify = FALSE)
for(i in seq_along(z)) for(j in seq_along(z[[1]])) z1[[i]] <- z1[[i]] + z[[i]][[j]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...