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

时间:2017-04-04 18:47:22

标签: r merge plyr

我无法使用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型总支出百分比的人。

我可能没有说清楚。

谢谢!

1 个答案:

答案 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