让我们有一些愚蠢的数据,这些数据是我在使用group by并从dplyr总结之后获得的结果
Name<-rep(c("Pepsi","Cola"),3)
Category<-c("A","A","A","B","B","B")
Value<-1:6
aha<-as.data.frame(cbind(Name,Category,Value))
aha$Value<-as.numeric(as.character(aha$Value))
我们的数据框架如下所示
Name Category Value
1 Pepsi A 1
2 Cola A 2
3 Pepsi A 3
4 Cola B 4
5 Pepsi B 5
6 Cola B 6
我想计算新列,我得到值/总和(值),但条件是类别。
E.g。对于第一次,其1/6 = 0,17,因为A类别的值总和为6。
我发现如何使用plyr,但它与dplyr不相符
请帮帮我
答案 0 :(得分:2)
两种不使用额外包装的替代方案:
# option 1
transform(aha, new = ave(Value, Category, FUN = function(x) x/sum(x)))
# option 2
aha$new <- ave(aha$Value, aha$Category, FUN = function(x) x/sum(x))
答案 1 :(得分:1)
您可以使用dplyr
:
aha %>% group_by(Category) %>% mutate(new=Value/sum(Value))
#Source: local data frame [6 x 4]
#Groups: Category [2]
# Name Category Value new
# (fctr) (fctr) (dbl) (dbl)
#1 Pepsi A 1 0.1666667
#2 Cola A 2 0.3333333
#3 Pepsi A 3 0.5000000
#4 Cola B 4 0.2666667
#5 Pepsi B 5 0.3333333
#6 Cola B 6 0.4000000
答案 2 :(得分:0)
使用data.table
library(data.table)
setDT(aha)[, new := Value/sum(Value) , by = Category]
答案 3 :(得分:0)
基地R还有一个
aha$new <- unlist(tapply(aha$Value, aha$Category,function(x) x/sum(x)))