我无法使用ddply和merge的组合来聚合一些变量。我使用的数据框非常大,所以我在下面举一个例子:
data_sample <- cbind.data.frame(c(123,123,123,321,321,134,145,000),
c('j', 'f','j','f','f','o','j','f'),
c(seq(110,180, by = 10)))
colnames(data_sample) <- c('Person','Expense_Type','Expense_Value')
我想为每个人计算j类费用在个人总费用上的百分比。
data_sample2 <- ddply(data_sample, c('Person'), transform, total = sum(Value))
data_sample2 <- ddply(data_sample2, c('Person','Type'), transform, empresa = sum(Value))
这就是我所做的按类型列出总费用,但问题是并非所有人都有j型费用,所以他们的百分比应为0而我不知道如何只留一行具有j型总支出百分比的人。
我可能没有说清楚。
谢谢!
答案 0 :(得分:1)
我们可以使用by
函数:
by(data_sample, data_sample$Person, FUN = function(dat){
sum(dat[dat$Expense_Type == 'j',]$Expense_Value) / sum(dat$Expense_Value)
})
我们还可以使用 dplyr
包:
library(dplyr)
data_sample %>%
group_by(Person) %>%
summarise(Percent_J = sum(ifelse(Expense_Type == 'j', Expense_Value, 0)) / sum(Expense_Value))
# A tibble: 5 × 2
Person Percent_J
<dbl> <dbl>
1 0 0.0000000
2 123 0.6666667
3 134 0.0000000
4 145 1.0000000
5 321 0.0000000