2017-06-28 88 views
0

私は6つの異なる変数の観測値とそれぞれのサンプル重みを持つデータフレームを持っています。私はddplysummarizeを使用して新しいデータフレームを作成しようとしています.6つの変数の1つが最初の列になり、残りが他の列の加重合計になります。R(ddply、summarize、sum)での条件付き加算

例えば、私のデータフレームは、このようなものになります。

Location A B C D SampleWeight 
x1  2 1 4 3 .1 
x1  4 3 4 2 .3 
x2  2 3 7 3 .7 
x2  4 3 4 3 .8 
..... 

を私が場所ごとに値を1つだけ持つデータフレームを作成したい、その後、各列に各条件のためSampleWeightsを合計します全体として。それは次のようになります。

Location Total A2 A4 B1 B3 C4 C7 ... 
x1   0.4  .1 .3 .1 .3 .4 0.0 
x2   1.5  .7 .8 0.0 1.5 .8 .7 

これは、私はそれについて移動しようとしていた、と私は仕事に合計列を得ている方法ですが、私は合計のみになりますことをフィルタがこのような作り方を確認していません他の列の特定の値を持つ行に表示されます。私が試してみましたいくつかのものが含まれている:

newdf <- ddply(mydf, ~ `Location`, summarize, 
       total = sum(`SampleWeight`), 
       A2 = sum(within(`SampleWeight`, A == "2")), 
       A4 = sum(filter(mydf$SampleWeight, A == "4")), 
       B1 = sum((mydf$B=="1")$sample_weight) 
       ... 
       ) 

がこれを行うことについて移動する簡単な方法はありますか?この種のファイラーを作る良い方法はありますか?

ありがとうございます!

答えて

0

ここでは、dplyrtidyrを使用する解決策があります。生成データ:そして

library(dplyr) 
library(tidyr) 

df <- tibble(location  = c("x1", "x1", "x2", "x2"), 
      A   = c(2, 4, 2, 4), 
      B   = c(1, 3, 3, 3), 
      C   = c(4, 4, 7, 4), 
      D   = c(3, 2, 3, 3), 
      SampleWeight = c(.1, .3, .7, .8)) 

:長い形式に合計SampleWeight

  • gatherデータを

    1. group_by位置と計算:これは、4つの部分に分けることができる

      res <- df %>% 
          group_by(location) %>% 
          mutate(total = sum(SampleWeight)) %>% 
          gather(key = "letter", value = "number", A, B, C, D) %>% 
          mutate(subgroup = paste0(letter, number)) %>% 
          group_by(location, subgroup, total) %>% 
          summarize(subgroup_total = sum(SampleWeight)) %>% 
          spread(key = subgroup, value = subgroup_total) %>% 
          mutate_all(function (x) ifelse(is.na(x), 0, x)) 
      

      paste0を使用して連結し、所望のサブグループを構築する(これは

      res 
          location total A2 A4 B1 B3 C4 C7 D2 D3 
      1  x1 0.4 0.1 0.3 0.1 0.3 0.4 0.0 0.3 0.1 
      2  x2 1.5 0.7 0.8 0.0 1.5 0.8 0.7 0.0 1.5 
      
      :、次いでspreadデータワイドフォーマット
    2. の列)
    3. group_by亜群とSampleWeightの和を計算するには、0

    と結果をNAを交換します