我无法想象我是第一个有这个问题的人,但我还没有找到解决方案(这里或其他地方).
我有几列,我想在R中平均.唯一最简单的方面是一些列包含NA.
例如:
Trait Col1 Col2 Col3
DF 23 NA 23
DG 2 2 2
DH NA 9 9
Run Code Online (Sandbox Code Playgroud)
我想创建一个Col4,它平均前3列中的条目,忽略了NA.所以:
Trait Col1 Col2 Col3 Col4
DF 23 NA 23 23
DG 2 2 2 2
DH NA 9 9 9
Run Code Online (Sandbox Code Playgroud)
理想情况下这样的事情会起作用:
data$Col4 <- mean(data$Chr1, data$Chr2, data$Chr3, na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.
Rei*_*son 27
你想要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
Run Code Online (Sandbox Code Playgroud)
要匹配您的示例:
> 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
Run Code Online (Sandbox Code Playgroud)
为什么不接受接受的答案?
接受的答案是正确的,但是,它对于这个特定任务来说过于具体,不可能一概而论。如果我们需要的不是 、 等mean其他统计数据,甚至是自定义函数,该怎么var办?skewness
更灵活的解决方案:
row_means <- apply(X=data, MARGIN=1, FUN=mean, na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)
更多详细信息apply:
一般来说,要在整个数据集上应用任何函数(自定义或内置),应使用按列或按行apply或其变体之一( 、 lapply`,...)。sapply它的签名是:
apply(X, MARGIN, FUN, na.rm)
Run Code Online (Sandbox Code Playgroud)
在哪里:
X:数据框或矩阵形式的数据。MARGIN:发生聚合的维度。用于1按行运算和2按列运算。FUN:对数据调用的操作。这里可以使用任何预定义的 R 函数以及任何用户定义的函数。na.rm:如果TRUE,则在调用NA之前这些值将被删除。FUN我为什么要使用apply?
出于多种原因,包括但不限于:
apply.lapply对于列表上的操作)。mclapply从{parallel}库)。例如,请参阅[+]或[+]。