可能重复:
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列数据。
答案 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
调用此方法来获取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
希望这有帮助。
答案 1 :(得分:2)
聚合函数就是为此而设计的。
aggregate(dfrm$cens, dfrm["group"], FUN-mean)
您可以同时获得几个列的平均值,每个列都在'group'
中aggregate(dfrm[ , c("Result", "cens") ], dfrm["group"], FUN=mean)