我有一个与Calculate "group characteristics" without ddply and merge
相关的后续问题我有一个类似的数据框(如下所示),但试图计算同一类别中其他水果中腐烂水果的百分比。因此,我不应该考虑到有问题的水果本身是否腐烂。每个数据帧有望澄清这一点,所需的结果列纯粹是为了示例目的插入的。
理想情况下,我想使用ddply(沿着ddply(df,。(Fruit),mutate,Perc = sum(Rotten)/ length(Rotten)))。但是,我找不到一种方法来只考虑同一组中其他行的值。我想我可以使用基于相关行的值的if语句组合,但我想知道是否有更优雅的方法来实现这一点?非常感谢,W
Fruit Rotten Desired_Outcome
1 Apple 1 0.33
2 Apple 1 0.33
3 Apple 0 0.66
4 Apple 0 0.66
5 Pear 1 0.66
6 Pear 1 0.66
7 Pear 1 0.66
8 Pear 0 1.00
9 Cherry 0 0.00
10 Cherry 0 0.00
11 Cherry 0 0.00
12 Banana 1 NA
Fruit=c(rep("Apple",4),rep("Pear",4),rep("Cherry",3),"Banana")
Gender=c(rep("Male",3),rep("Female",3))
Rotten=c(1,1,0,0,1,1,1,0,0,0,0,1)
Desired_Outcome=c(0.33,0.33,0.66,0.66,0.66,0.66,0.66,1,0,0,0,NA)
df=data.frame(Fruit,Rotten,Desired_Outcome)
df
答案 0 :(得分:5)
ddply(df,
.(Fruit),
mutate,
Perc = (sum(Rotten) - Rotten)/(length(Rotten)-1))
mutate
将按元素运行,因此您可以从总和中减去每行的值。
Fruit Rotten Desired_Outcome Perc
1 Apple 1 0.33 0.3333333
2 Apple 1 0.33 0.3333333
3 Apple 0 0.66 0.6666667
4 Apple 0 0.66 0.6666667
5 Banana 1 NA NaN
6 Cherry 0 0.00 0.0000000
7 Cherry 0 0.00 0.0000000
8 Cherry 0 0.00 0.0000000
9 Pear 1 0.66 0.6666667
10 Pear 1 0.66 0.6666667
11 Pear 1 0.66 0.6666667
12 Pear 0 1.00 1.0000000