2017-04-04 27 views
0

我无法使用ddply和merge的组合来聚合某些变量。我使用的数据帧是真正的大,所以我把下面的例子:如何在不是所有变量的元素都存在于R上时使用ddply进行聚合

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

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

它的工作!非常感谢你。 –

+0

假设原始数据集中的其他列的数据仅根据Person来变化。在聚合后我怎么能离开这些值? –

+0

因此,对于每个人来说,它是相同的值(例如,对于所有行,人员A只有x,对于所有行,人员B只有y)...?合并到一个不同的表格可能会起作用。否则,您可以将变量添加到'dplyr'中的'group_by'。 – bouncyball

相关问题