我的数据框如下所示:
> df
id u.1t u.2 v.1 v.2
1 A 1 NA 5 NA
2 A 2 NA 4 6
3 A 1 4 5 NA
4 B 10 13 40 NA
5 B 10 12 42 NA
6 B 10 NA 41 NA我想知道u.*和v.*列的id-specific均值分别如下:
> mean
id u.mean v.mean
1 A 2 5
2 B 11 41这就是数据
df<-data.frame(id=c("A","A","A","B","B","B"),u.1t=c(1,2,1,10,10,10),u.2=c(NA,NA,4,13,12,NA),v.1=c(5,4,5,40,42,41),v.2=c(NA,6,NA,NA,NA,NA))很明显,通过引入NA,总体均值与行或列均值的均值不相等,这就是这里的问题所在。
我以为这是by的工作,但事实证明,除了按列操作之外,我不能让by做任何事情?
非常感谢您的帮助--谢谢
发布于 2012-09-19 19:56:15
如果您想使用by,请尝试如下所示:
by(x, x$id, function(x) colMeans(x[,-1], na.rm=TRUE))输出有点难看。虽然您可以对其进行整理,但我将使用plyr包:
library(plyr)
ddply(x, .(id), function(x) colMeans(x[,-1], na.rm=TRUE))这并没有达到您想要的效果,因为它取每列的平均值:它没有将u.*和v.*列组合在一起。为此,我将首先使用melt数据,然后使用plyr
library(reshape2)
y <- melt(x)
y$variable <- gsub("\\..*", '', y$variable)
y
# id variable value
#1 A u 1
#2 A u 2
#3 A u 1
#4 B u 10
#5 B u 10
#6 B u 10
#7 A u NA
# (etc)
z <- ddply(y, .(id, variable), summarise, mean = mean(value, na.rm=TRUE))
z
# id variable mean
#1 A u 2
#2 A v 5
#3 B u 11
#4 B v 41如果你选择这样做,你可以用cast返回:
dcast(z, id~variable)
# id u v
#1 A 2 5
#2 B 11 41 发布于 2012-09-20 19:22:58
肖恩说对了。他的解决方案效果很好。
但是,由于变量名中的模式替换通常是不方便的、不适用的(就像我的例子一样--不是这个例子),或者根本不是每个人都喜欢的,所以我们不妨引入一个新的因素来区分u's和v's。cast直接给出了答案(不需要plyr):
require(reshape2)
y<-melt(df)
y$x[y$variable %in% c("u.1t","u.2")]<-"u"
y$x[y$variable %in% c("v.1","v.2")]<-"v"
y
# id variable value x
#1 A u.1t 1 u
#2 A u.1t 2 u
#3 A u.1t 1 u
#4 B u.1t 10 u
#5 B u.1t 10 u
# ...
#22 B v.2 NA v
#23 B v.2 NA v
#24 B v.2 NA v
dcast(y,y$id~x,mean, na.rm=T)
# y$id u v
#1 A 2 5
#2 B 11 41甚至不需要对新创建的列y$x进行因子分解
> sapply(y, class)
id variable value x
"factor" "factor" "numeric" "character" https://stackoverflow.com/questions/12494076
复制相似问题