3

我的数据框如下所示:

> 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

我想知道和列的id-specific 方法分别是这样的:u.*v.*

> 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

非常感谢您的帮助-谢谢

4

2 回答 2

5

如果您想使用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.*andv.*列。为此,我会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-19T11:56:15.433 回答
0

肖恩做对了。他的解决方案非常完美。

但是,由于变量名称中的模式替换通常很不方便,不适用(在我的情况下 - 不是示例),或者根本不是每个人的一杯茶,所以不妨引入一个新因素来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" 
于 2012-09-20T11:22:58.397 回答