在R中每行列表计算之间的差异

3

假设我有以下df列表(实际上我有更多的dfs)。

seq <- c("12345","67890")

li <- list()

for (i in 1:length(seq)){

  li[[i]] <- list()

  names(li)[i] <- seq[i]

  li[[i]] <- data.frame(A = c(1,2,3),
                        B = c(2,4,6))
}

我希望能够在两个列表相同的单元格位置计算平均值,并保留与原始列表相同的行数和列数。我应该如何做?我相信可以使用apply()函数,但不确定具体操作方法。
预期输出(毫不意外):
  A B
1 1 2
2 2 4
3 3 6

实际上,每个列表中的值并不一定相同。


1
你已经有一个答案了,但是这里还有一些建议:1)seq是一个基础函数,请使用另外的名称;2)没有必要使用li[[i]] <- list(),因为之后您会重新指派它到一个df上;3)仅在循环后执行一次names(li) <- seq;4)作为循环控制,seq_along(li)1:length()更好。如果length(li)为零,你将得到向量1:0,但是使用seq_along不会引发错误。 - Rui Barradas
1个回答

4
如果没有任何的NA,那么我们可以使用Reduce来对每个元素的观测值进行求和,并且再除以listlength来得到结果。
Reduce(`+`, li)/length(li)
#  A B
#1 1 2
#2 2 4
#3 3 6

如果存在NA值,则最好使用mean(具有na.rm参数)。为此,我们可以将其转换为array,然后使用apply函数。

apply(array(unlist(li), dim = c(dim(li[[1]]), length(li))), c(1, 2), mean)

tidyverse中的等效选项是

library(tidyverse)
reduce(li, `+`)/length(li)

1
哇,这些解决方案非常简单。甚至不需要使用任何apply()函数。谢谢! - FlyingDutch
@FlyingDutch 只有当没有 NAs 时,1 + NA + 5 才会得到 NA。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接