2016-09-16 6 views
1

私はこれを説明するのが苦労していますので、例題で説明するのが一番です(貧しい質問のタイトルからも分かるように)。は、因子に基づいてデータフレームの操作を実行します。

dplyrを使用すると、私はgroup_bysummarizeという結果を得ています。私は、因子によるさらなる操作をしたいデータフレームを持っています。

> df <- data.frame(run=as.factor(c(rep(1,3), rep(2,3))), 
      group=as.factor(rep(c("a","b","c"),2)), 
      sum=c(1,8,34,2,7,33)) 
> df 
    run group sum 
1 1  a 1 
2 1  b 8 
3 1  c 34 
4 2  a 2 
5 2  b 7 
6 2  c 33 

私はrunに依存する値でsumを分割したい:例として

は、ここに私のdplyr演算の結果のように見えるデータフレームです。例えば、私が持っている場合:

> total <- data.frame(run=as.factor(c(1,2)), 
         total=c(45,47)) 
> total 
    run total 
1 1 45 
2 2 47 

をその後、私の最後のデータフレームは、次のようになります。私は手動手でpercent列に分数を挿入

> df 
    run group sum percent 
1 1  a 1 1/45 
2 1  b 8 8/45 
3 1  c 34 34/45 
4 2  a 2 2/47 
5 2  b 7 7/47 
6 2  c 33 33/47 

は私が望む動作にを表示します行う。

おそらくmutateでこれを行ういくつかのdplyrの方法がありますが、私はすぐにそれを把握できないようです。これはどのように達成されるでしょうか?

+0

のdf $パーセント< - DFの$合計/総[DFの$ラン、 '総'] – HubertL

+0

非常にエレガントなHubertL。あなたが答えとして投稿するなら、私は受け入れます。これは、私が 'mutate'で想像していたよりも簡単です(ただし動作​​します)。 –

答えて

4

(基Rで)動作します

あなたはdfの各実行の合計を取得するルックアップテーブルとしてtotalを使用することができます。

total[df$run,'total'] 
[1] 45 45 45 47 47 47 

そして、あなたは単純に合計を分割し、新しい列に結果を割り当てるためにそれを使用する:

df$percent <- df$sum/total[df$run,'total'] 

    run group sum percent 
1 1  a 1 0.02222222 
2 1  b 8 0.17777778 
3 1  c 34 0.75555556 
4 2  a 2 0.04255319 
5 2  b 7 0.14893617 
6 2  c 33 0.70212766 
0

まず、あなたのDFに合計値にマージしたい:

df2 <- merge(df, total, by = "run") 

あなたはのmutate呼び出すことができます。

df2 %<>% mutate(percent = sum/total) 
1

あなたの "実行" の値が1,2の場合は... Nこれは

divisor <- c(45,47) # c(45,47,...up to n divisors) 
df$percent <- df$sum/divisor[df$run] 
0

その後、その場で再び、新しい列をマージして追加し、インプレースdata.tableに変換:

library(data.table) 

setDT(df)[total, on = 'run', percent := sum/total] 
df 
# run group sum percent 
#1: 1  a 1 0.02222222 
#2: 1  b 8 0.17777778 
#3: 1  c 34 0.75555556 
#4: 2  a 2 0.04255319 
#5: 2  b 7 0.14893617 
#6: 2  c 33 0.70212766 
関連する問題