导入您的数据:
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
希望这会有所帮助。