23

我无法想象我是第一个提出这个问题的人,但我还没有找到解决方案(这里或其他地方)。

我有几列,我想在 R 中平均。唯一最棘手的方面是某些列包含 NA。

例如:

Trait Col1 Col2 Col3
DF    23   NA   23
DG    2    2    2
DH    NA   9    9

我想创建一个 Col4 来平均前 3 列中的条目,忽略 NA。所以:

 Trait Col1 Col2 Col3 Col4
 DF    23   NA   23   23
 DG    2    2    2    2
 DH    NA   9    9    9 

理想情况下,这样的事情会起作用:

data$Col4 <- mean(data$Chr1, data$Chr2, data$Chr3, na.rm=TRUE)

但事实并非如此。

4

2 回答 2

33

您想要rowMeans()但重要的是要注意它有一个na.rm您想要设置为的参数TRUE。例如:

> mat <- matrix(c(23,2,NA,NA,2,9,23,2,9), ncol = 3)
> mat
     [,1] [,2] [,3]
[1,]   23   NA   23
[2,]    2    2    2
[3,]   NA    9    9
> rowMeans(mat)
[1] NA  2 NA
> rowMeans(mat, na.rm = TRUE)
[1] 23  2  9

为了匹配您的示例:

> dat <- data.frame(Trait = c("DF","DG","DH"), mat)
> names(dat) <- c("Trait", paste0("Col", 1:3))
> dat
  Trait Col1 Col2 Col3
1    DF   23   NA   23
2    DG    2    2    2
3    DH   NA    9    9
> dat <- transform(dat, Col4 = rowMeans(dat[,-1], na.rm = TRUE))
> dat
  Trait Col1 Col2 Col3 Col4
1    DF   23   NA   23   23
2    DG    2    2    2    2
3    DH   NA    9    9    9
于 2012-09-18T23:02:48.177 回答
4

为什么不是公认的答案? 公认的答案是正确的,但是,它对这个特定任务过于具体,无法一概而论。如果我们需要,而不是mean其他统计信息,例如var,skewness等,甚至是自定义函数怎么办?

更灵活的解决方案:

row_means <- apply(X=data, MARGIN=1, FUN=mean, na.rm=TRUE)

更多详情apply

通常,要在整个数据集上应用任何函数(自定义或内置),应使用按列或按行,apply或其变体之一(sapply、lapply`、...)。它的签名是:

apply(X, MARGIN, FUN, na.rm)

在哪里:

  • X:表单数据框或矩阵的数据。
  • MARGIN:发生聚合的维度。用于1按行操作和2按列操作。
  • FUN:要对数据调用的操作。这里可以使用任何预定义的 R 函数以及任何用户定义的函数。
  • na.rm: 如果TRUENA值将在FUN被调用之前被删除。

为什么要使用apply

出于多种原因,包括但不限于:

  1. 任何功能都可以轻松插入apply
  2. 对于不同的偏好,例如输入或输出数据类型,可以使用其他变体(例如,lapply对于列表上的操作)。
  3. 最重要的是)它促进了可扩展性,因为这个函数的版本允许并行执行(例如mclapply{parallel}库中)。例如,参见[+][+]
于 2019-10-27T14:51:12.340 回答