R data.table,因子变量的平均实例数,由两个其他因子变量分组

时间:2015-10-22 16:48:29

标签: r data.table plyr

我正在尝试使用ddply来处理data.table(dt1)。例如,dt1由三个因子列组成。我需要做的是创建第四个数字列,通过“walk”和“date”的组合计算“pres”列中“1”的平均发生次数。

dt1 <- data.table (walk = as.factor(rep(1:3, each=12)),
               date = as.factor(rep(1:4, 9)),
               pres = as.factor(rbinom(36,1,0.5))
               )

创建一个像这样的数据表

> head (dt1)
   walk date pres
1:    1    1    0
2:    1    1    0
3:    1    1    1
4:    1    2    1
5:    1    2    1
6:    1    2    1

我希望最终得到的是这样的

> head (dt1)
   walk date pres  mean
1:    1    1    0   0.33
2:    1    1    0   0.33
3:    1    1    1   0.33
4:    1    2    1   1.00
5:    1    2    1   1.00
6:    1    2    1   1.00

我正在尝试使用ddply函数并认为我已接近但尚未正确使用函数部分

ddply(dt1, .variables=c("walk","date"), .fun = sum(dt1[, pres] == "1") / length(dt1[,pres])) [ , ]

有关如何正确设置公式的建议,或者更好的解决方案,非常欢迎。

1 个答案:

答案 0 :(得分:3)

我们按照&#39; walk&#39;,&#39; date&#39;分组,创建一个新列&#39; Mean&#39;通过从逻辑索引<script> $("li").click(function(){ if($(this).hasClass('alpha')) $(".color")[0].className = 'red'; if($(this).hasClass('bravo')) $(".color")[0].className = 'blue'; if($(this).hasClass('charlie')) $(".color")[0].className = 'orange'; ); $(".color").click(function(e) { $(".color").toggleClass('dark' + $(this).className); }); </script> 分配:=的{​​{1}}输出。

mean

或者@Frank提到,我们可以pres==1逻辑索引并除以行数( dt1[, Mean := mean(pres==1) , by=.(walk, date)]

sum

由于OP使用.N,因此等效选项为

 dt1[, Mean := sum(pres==1)/.N, by = .(walk, date)]

或者如果我们使用ddply

 library(plyr)
 ddply(dt1, .variables=c('walk', 'date'),  mutate, Mean= mean(pres==1))

dplyr选项

 library(dplyr)
 dt1 %>%
    group_by(walk, date) %>%
    dplyr::mutate(Mean= mean(pres==1))