对行和列进行平均,允许NA

Jan*_*hoo 3 r

我的数据框如下所示:

> 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做任何事情?

非常感谢帮助 - 谢谢

sea*_*ody 5

如果你想使用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)