我的数据框如下所示:
> 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
Run Code Online (Sandbox Code Playgroud)
我想分别知道id
这个u.*
和v.*
列的特定方法,如下所示:
> mean
id u.mean v.mean
1 A 2 5
2 B 11 41
Run Code Online (Sandbox Code Playgroud)
这是数据
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))
Run Code Online (Sandbox Code Playgroud)
很明显,通过引入NA,总体平均值不等于行或列均值的平均值,这是这里的问题.
我认为这是一份工作by
,但事实证明除了列式操作我不能by
做任何事情?
非常感谢帮助 - 谢谢
如果你想使用by
,尝试这样的事情:
by(x, x$id, function(x) colMeans(x[,-1], na.rm=TRUE))
Run Code Online (Sandbox Code Playgroud)
输出有点难看.虽然你可以整理,我会使用plyr
包:
library(plyr)
ddply(x, .(id), function(x) colMeans(x[,-1], na.rm=TRUE))
Run Code Online (Sandbox Code Playgroud)
这并不能完全达到你所追求的目标,因为它取每列的平均值:它没有组合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
Run Code Online (Sandbox Code Playgroud)
如果你选择,你可以cast
回复:
dcast(z, id~variable)
# id u v
#1 A 2 5
#2 B 11 41
Run Code Online (Sandbox Code Playgroud)