基于多个变量计算数据子集的均值(对于每个组合)

时间:2014-01-23 05:51:10

标签: r

我有以下形式的数据集:

object.type    condition    date       replicate    value
object1        condition1   17/2/2014     1         5000
object1        condition1   17/2/2014     2         6000
object1        condition1   18/2/2014     1         5500
object1        condition1   18/2/2014     2         6300

object1        condition2   17/2/2014     1         5000
object1        condition2   17/2/2014     2         6000
object1        condition2   18/2/2014     1         5500
object1        condition2   18/2/2014     2         6300

object2        condition1   17/2/2014     1         5000
object2        condition1   17/2/2014     2         6000
object2        condition1   18/2/2014     1         5500
object2        condition1   18/2/2014     2         6300
etc.

我想要做的是计算特定条件下某个对象的子集的平均值。因此,例如,对于object1,在条件1中,在17日,该值将为mean(c(5000, 5500))。所以,最后我得到了一个像这样的data.frame:

object.type    condition    date          value
object1        condition1   17/2/2014     5250
object1        condition1   18/2/2014     6150
object1        condition2   17/2/2014     5250
object1        condition2   18/2/2014     6150
object2        condition1   17/2/2014     5250
etc.

我可以使用嵌套循环(循环遍历所有级别的对象类型,循环遍历所有级别的条件,循环遍历所有级别的日期),但我是R的新手,我学到的是矢量化是解决这些问题的最佳方法。我似乎无法弄清楚我会怎么做。有什么功能在这里有用吗?或者除了使用三个嵌套的for循环之外,还需要一个更简洁的方法来迭代(并且效率低下)扩展数据框?

2 个答案:

答案 0 :(得分:1)

使用aggregate(...),并假设您的数据位于df

result <- aggregate(value ~ object.type + condition + date, df, mean)
result
#   object.type  condition      date value
# 1     object1 condition1 17/2/2014  5500
# 2     object2 condition1 17/2/2014  5500
# 3     object1 condition2 17/2/2014  5500
# 4     object1 condition1 18/2/2014  5900
# 5     object2 condition1 18/2/2014  5900
# 6     object1 condition2 18/2/2014  5900

如果您需要原始订单中的result

result <- with(result,result[order(object.type, condition, date),])
result
#   object.type  condition      date value
# 1     object1 condition1 17/2/2014  5500
# 4     object1 condition1 18/2/2014  5900
# 3     object1 condition2 17/2/2014  5500
# 6     object1 condition2 18/2/2014  5900
# 2     object2 condition1 17/2/2014  5500
# 5     object2 condition1 18/2/2014  5900

答案 1 :(得分:0)

library(plyr)
ddply(data,~ object.type  +  condition ,summarise,average=mean(value)) 

从plyr包中试试上述内容