按R中的行组进行分析

时间:2012-12-09 23:23:41

标签: r

  

可能重复:
  Averaging column values for specific sections of data corresponding to other column values

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

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列数据。

2 个答案:

答案 0 :(得分: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调用此方法来获取Resultcens的平均值,如下所示:

> 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

希望这有帮助。

答案 1 :(得分:2)

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

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

您可以同时获得几个列的平均值,每个列都在'group'

aggregate(dfrm[ , c("Result", "cens") ], dfrm["group"], FUN=mean)