我有以下数据框:
> 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(每行)添加列?谢谢你的帮助。
答案 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)
您可以使用已matrixStats
,rowMedians
,rowSds
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的详细答案