2017-01-06 2 views
0

私は職業と年のパーセンテージとして値を計算しようとしています。例として、以下のdfを使用して、最初の行の割合は次のようになります。1列の異なる行のパーセンテージを計算するにはどうすればよいですか?

665 /(+ 709 665)= 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のための新しい学習者です、あなたの答えは私に非常に有益です! –

関連する問題