我的数据框是这样的:
> 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
特定方法,如下所示:
> 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
做任何事情,只能按列操作?
非常感谢帮助--谢谢
最佳答案
如果你想使用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.*
列。为此,我会先融化
数据,然后使用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
如果您愿意,您可以强制转换
:
dcast(z, id~variable)
# id u v
#1 A 2 5
#2 B 11 41
关于r - 对允许 NA 的行和列进行平均,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12494076/