0

可能重复:
平均对应于其他列值的特定数据部分的列值

我想按组分析数据集。数据设置如下:

Group   Result   cens
   A    1.3        1
   A    2.4        0
   A    2.1        0
   B    1.2        1
   B    1.7        0
   B    1.9        0

我有一个计算以下内容的函数

sumStats = function(obs, cens) {
detects = obs[cens==0]
nondetects= obs[cens=1]
mean.detects=mean(detects) 
return(mean.detects) }

这当然是一个用于说明目的的简单功能。R中是否有一个函数可以让我使用这个需要输入2个变量来按组分析数据的自制函数。

我查看了 by 函数,但它似乎一次接收 1 列数据。

4

2 回答 2

2

导入您的数据:

test <- read.table(header=TRUE,textConnection("Group   Result   cens
   A    1.3        1
   A    2.4        0
   A    2.1        0
   B    1.2        1
   B    1.7        0
   B    1.9        0"))

虽然有很多方法可以做到这一点,但by具体使用你可以做这样的事情(假设你的数据框被调用test):

by(test,test$Group,function(x) mean(x$Result[x$cens==1]))

这将为您提供Results每组中所有值的平均值cens==1

输出如下所示:

test$Group: A
[1] 1.3
----------------------------------------------------------------------
test$Group: B
[1] 1.2

为了帮助您了解这可能如何与您的函数一起工作,请考虑以下几点:如果您只是询问每个组的内容的by声明return,您将得到:

> by(test,test$Group,function(x) return(x))
test$Group: A
  Group Result cens
1     A    1.3    1
2     A    2.4    0
3     A    2.1    0
----------------------------------------------------------------------- 
test$Group: B
  Group Result cens
4     B    1.2    1
5     B    1.7    0
6     B    1.9    0

...实际上是 2 个数据帧,每个组只有行,存储为一个列表:这意味着您可以访问每个组的部分 data.frames,就像在它们被拆分之前一样。上面的x函数是指每个组的整个子数据帧。即 - 您可以使用单个变量作为x传递给函数的一部分 - 一个基本示例:

> by(test,test$Group,function(x) x$Result)
test$Group: A
[1] 1.3 2.4 2.1
-------------------------------------------------------------------
test$Group: B
[1] 1.2 1.7 1.9

现在,终于可以回答您的具体问题了!如果您采用一个示例函数,该函数分别获取两个输入的平均值:

sumStats = function(var1, var2) {
   res1 <- mean(var1)
   res2 <- mean(var2)
   output <- c(res1,res2)
   return(output)
}

你可以调用它by来获得两者的平均值,Result就像cens这样:

> by(test,test$Group,function(x) sumStats(x$Result,x$cens))
test$Group: A
[1] 1.9333333 0.3333333
---------------------------------------------------------------------- 
test$Group: B
[1] 1.6000000 0.3333333

希望这会有所帮助。

于 2012-12-10T00:03:03.280 回答
2

聚合函数就是为此而设计的。

 aggregate(dfrm$cens, dfrm["group"], FUN-mean)

您可以一次获得几列的平均值,每列都在“组”中

aggregate(dfrm[ , c("Result", "cens") ], dfrm["group"], FUN=mean)
于 2012-12-10T05:35:22.317 回答