在R中添加行的mean和sd的列

时间:2014-09-01 01:24:05

标签: r

我有以下数据框:

> ddf
  aa bb cc dd
1  1  2  3  4
2  5  6  7  8
3  9 10 11 12
> 
> 
> dput(ddf)
structure(list(aa = c(1L, 5L, 9L), bb = c(2L, 6L, 10L), cc = c(3L, 
7L, 11L), dd = c(4L, 8L, 12L)), .Names = c("aa", "bb", "cc", 
"dd"), class = "data.frame", row.names = c(NA, -3L))
> 

我想添加mean和sd列(每行的mean和sd),但是后续不起作用:

ddf$mean = mean(ddf[,1:4])
Warning message:
In mean.default(ddf[, 1:4]) :
  argument is not numeric or logical: returning NA
> ddf$sd = sd(ddf[,1:4])
Error in is.data.frame(x) : 
  (list) object cannot be coerced to type 'double'
> 
> ddf
  aa bb cc dd mean
1  1  2  3  4   NA
2  5  6  7  8   NA
3  9 10 11 12   NA

如何为mean和sd(每行)添加列?谢谢你的帮助。

4 个答案:

答案 0 :(得分:4)

如果要获得每列的均值,可以使用rowMeans()。对于SD,我在这里使用了apply()。

ddf$Rmean <- rowMeans(ddf)
ddf$SD <- apply(ddf[1:4], 1, sd)

#  aa bb cc dd Rmean       SD
#1  1  2  3  4   2.5 1.290994
#2  5  6  7  8   6.5 1.290994
#3  9 10 11 12  10.5 1.290994

答案 1 :(得分:4)

我会为此写一个函数。这样你可以在以后添加它,如果需要,你不需要多次写na.rm = TRUE

foo <- function(x, digits = 3L, ...) {
    x <- c(x, recursive = TRUE, use.names = FALSE)
    res <- c(mean = mean(x, ...), sd = sd(x, ...),
             median = median(x, ...), max = max(x, ...))
    round(res, digits)
}
cbind(ddf, t(apply(ddf, 1, foo, na.rm = TRUE)))
#   aa bb cc dd mean    sd median max
# 1  1  2  3  4  2.5 1.291    2.5   4
# 2  5  6  7  8  6.5 1.291    6.5   8
# 3  9 10 11 12 10.5 1.291   10.5  12

答案 2 :(得分:2)

您可以使用已matrixStatsrowMediansrowSds

rowMaxs
library(matrixStats)

 m1 <- as.matrix(ddf)
 cbind(ddf, 
       mean=rowMeans(m1),sd=rowSds(m1), median=rowMedians(m1), max=rowMaxs(m1)) 
 #  aa bb cc dd mean       sd median max
 #1  1  2  3  4  2.5 1.290994    2.5   4
 #2  5  6  7  8  6.5 1.290994    6.5   8
 #3  9 10 11 12 10.5 1.290994   10.5  12

答案 3 :(得分:1)

rowmeansmean<- rowMeans(ddf, na.rm = TRUE) #will get you your row means. 

ddfwithmean<- cbind(ddf, rowmeansmean) # adds means to existing dataframe

然后您需要对SD执行相同的操作,这可以通过apply()完成,但也可以查看Jazzuro的详细答案