我想从一个数据框计算mean和sd,参数为一列,组标识为一列。使用tapply
时如何计算它们?我可以使用sd(v1, group, na.rm=TRUE)
,但在使用na.rm=TRUE
时不能使tapply
符合语句。
omit.na
是不可取的。我有一大堆参数,在排除所有缺少值的行时,必须逐步完成它们而不会丢失一半的数据帧。
data("weightgain", package = "HSAUR")
tapply(weightgain$weightgain, list(weightgain$source, weightgain$type), mean)
by
语句也是如此。
x<-c(1,2,3,4,5,6,7,8,9,NA)
y<-c(2,3,NA,3,4,NA,2,3,NA,2)
group<-rep((factor(LETTERS[1:2])),5)
df<-data.frame(x,y,group)
df
by(df$x,df$group,summary)
by(df$x,df$group,mean)
sd(df$x) #result: NA
sd(df$x, na.rm=TRUE) #result: 2.738613
有任何想法如何完成这项工作?
答案 0 :(得分:20)
只需在na.rm=TRUE
功能中设置tapply
:
tapply(weightgain$weightgain, list(weightgain$source, weightgain$type), mean, na.rm=TRUE)
答案 1 :(得分:5)
我认为这应该做你想要的。
选择所需的列:
v = c("x", "y")#or
v = colnames(df)[1:2]
使用sapply
迭代v
并将值传递给tapply
:
sapply(v, function(i) tapply(df[[i]], df$group, sd, na.rm=TRUE))