当 R 上不存在变量的所有元素时如何使用 ddply 进行聚合

How to aggregate using ddply when not all elements of a variable exist on R

我在使用 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类占总费用的百分比每人行

我可能没说清楚。

谢谢!

我们可以使用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