首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在行和列之间进行平均,允许NA

在行和列之间进行平均,允许NA
EN

Stack Overflow用户
提问于 2012-09-19 19:47:09
回答 2查看 170关注 0票数 3

我的数据框如下所示:

代码语言:javascript
复制
> 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均值分别如下:

代码语言:javascript
复制
> mean
  id u.mean v.mean
1  A      2      5
2  B     11     41

这就是数据

代码语言:javascript
复制
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做任何事情?

非常感谢您的帮助--谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-19 19:56:15

如果您想使用by,请尝试如下所示:

代码语言:javascript
复制
by(x, x$id, function(x) colMeans(x[,-1], na.rm=TRUE))

输出有点难看。虽然您可以对其进行整理,但我将使用plyr包:

代码语言:javascript
复制
library(plyr)
ddply(x, .(id), function(x) colMeans(x[,-1], na.rm=TRUE))

这并没有达到您想要的效果,因为它取每列的平均值:它没有将u.*v.*列组合在一起。为此,我将首先使用melt数据,然后使用plyr

代码语言:javascript
复制
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返回:

代码语言:javascript
复制
dcast(z, id~variable)
#  id  u  v
#1  A  2  5
#2  B 11 41    
票数 5
EN

Stack Overflow用户

发布于 2012-09-20 19:22:58

肖恩说对了。他的解决方案效果很好。

但是,由于变量名中的模式替换通常是不方便的、不适用的(就像我的例子一样--不是这个例子),或者根本不是每个人都喜欢的,所以我们不妨引入一个新的因素来区分u'sv'scast直接给出了答案(不需要plyr):

代码语言:javascript
复制
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进行因子分解

代码语言:javascript
复制
> sapply(y, class)
        id    variable       value           x 
  "factor"    "factor"   "numeric" "character" 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12494076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档