元素明确表示具有NA的数据帧列表

hjw*_*hjw 1 r

我有一个数据帧列表x,我想找到数据帧中每个元素的平均值.我在Dimitris Rizopoulos网上礼貌地找到了一个优雅的解决方案.

x.mean = Reduce("+", x) / length(x) 
Run Code Online (Sandbox Code Playgroud)

但是,当数据帧包含NA时,这并不真正起作用.有没有一个很好的方法来实现这一目标?

mne*_*nel 7

这是一种使用的方法 data.table

步骤是(1)将每个data.frame [element]强制转换x为data.table,并使用rn标识rownames的列(称为).(2)在大数据表上,通过rowname计算每列的平均值(用na.rm = TRUE处理NA值).(3)取出rn色谱柱

library(data.table)


results <- rbindlist(lapply(x,data.table, keep.rownames = TRUE))[,
                     lapply(.SD, mean,na.rm = TRUE),by=rn][,rn := NULL]
Run Code Online (Sandbox Code Playgroud)

另一种方法是强制使用矩阵,"简化"为三维数组,然后在适当的边距上应用均值

    # for example

    results <- as.data.frame(apply(simplify2array(lapply(x, as.matrix)),1:2,mean, na.rm = TRUE))
Run Code Online (Sandbox Code Playgroud)


edd*_*ddi 5

我更喜欢@ mnel的解决方案,但作为一种教育练习,您可以NA在保持相同类型的逻辑的同时修改表达式以使用值:

Reduce(function(y,z) {y[is.na(y)] <- 0; z[is.na(z)] <- 0; y + z}, x) /
  Reduce('+', lapply(x, function(y) !is.na(y)))
Run Code Online (Sandbox Code Playgroud)

  • `replace` 适用于 `data.frame`,因此您可以执行类似 `nax &lt;- function(x, replace.with = 0) replace(x, is.na(x),replace.with); 减少(lapply(x,nax),f = '+')/长度(x)` (2认同)