我正在尝试使用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])) [ , ]
有关如何正确设置公式的建议,或者更好的解决方案,非常欢迎。
答案 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))