2017-01-06 101 views
0

我試圖計算佔職業和年份的百分比的價值。作爲一個例子,使用df下方,第一行的百分比是:如何計算一列中不同行的百分比?

665 /(665 + 709)= 48.4

我能夠使用聚合計算平均值,但我被困在如何計算百分比:aggregate(x=df$value, by=list(df$occupation, df$year),FUN = mean)

df <- data.frame(
    year = c(rep(2003, 8), rep(2005, 8)), 
    sex = c(rep(0, 4), rep(1, 4)), 
    occupation = rep(c(1:4), 4), 
    value = c(665, 661, 695, 450, 709, 460, 1033, 346, 808, 959, 651, 468, 756, 832, 1140, 431) 
) 
+2

請看看這些關於如何產生[最小,完整和可驗證的例子](http://stackoverflow.com/help/mcve)的技巧,以及這篇文章[創建一個很好的例子R](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。也許下面的提示[問一個好問題](http://stackoverflow.com/help/how-to-ask)也值得一讀。 – lmo

回答

2

我認爲你正在尋找的答案是:

aggregate(
    x = df$value, 
    by = list(df$occupation, df$year), 
    FUN = function(x) { 
    round(x/sum(x) * 100, 1) 
    } 
) 

基本上,答案是癥結在FUN參數中;爲了計算百分比,你需要一個函數告訴R在聚合時做什麼。由於R具有內置的平均功能,因此您在計算平均值時能夠提供meanFUN。 Hadley Wickham的Advanced R的functional programming chapter關於構建命名和匿名函數的更多細節。

也就是說,對於像這樣的數據處理任務,像dplyr這樣的軟件包真的非常擅長使任務更簡單,更易於閱讀。您可以使用上面的聚合答案,但除非您有理由(例如構建包並且您想避免依賴關係),否則額外的包可以使您的代碼更具可讀性和可維護性。

library(dplyr) 
output <- 
    df %>% 
    group_by(year, occupation) %>% 
    mutate(percent = round(value/sum(value) * 100, 1)) 

的另一個好處這種方法是將它添加到比骨料,在默認情況下產生可用,但不漂亮結果的 更清潔的方式您的原始數據結構。

vignette有這些類型的數據操作任務的一堆很好的例子。 dplyr/tidyr cheatsheet也對這些類型的任務有幫助。

我的答案依賴於dplyr,因爲它是我的工具;肯定有其他的(plyrdata.table),它可能更適合於給定的任務。我仍然喜歡dplyr這個問題,但我提到其他選項,因爲它總是值得考慮the best tool for the job

+0

非常感謝!你太好了!我是R的新學員,你的回答對我非常有益! –