2017-04-04 43 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

相關問題