2017-11-29 28 views
1

私は作業しているデータセットを持っており、年ごとの金額を合計する必要があります。別の変数の1つの要素から量を集計する別の変数を作成したいとします(例は米国金額のみです)。以下はこれらを別々に行う必要があるのですが、どうすればこのコードを組み合わせることができますか?合計を要素ごとに突き合わせるにはどうすればいいですか?

library(dplyr) 

new.data = old.data %>% 
    group_by(country, year) %>% 
    summarise(sum.amount = sum(amount)) %>% 
    inner_join(old.data %>% 
     filter(donor == "united states") %>% 
     group_by(country, year) %>% 
     summarise(us.amount = sum(amount))) 

するか、最初の集約のためmutateを使用し、第二のためfilter + summarize

country year donor amount 
china 2000 germany 20 
china 2000 france 30 
china 2000 united states 40 
china 2000 united states 50 
china 2001 germany 20 
china 2001 france 30 
china 2001 united states 40 
china 2001 united states 50 
china 2002 germany 20 
china 2002 france 30 
china 2002 united states 40 
china 2002 united states 50 

new.data <- old.data %>% 
    group_by(country, year) %>% 
    summarise(sum.amount = sum(amount)) %>% 

new.data <- old.data %>% 
    filter(donor == "United States") 
    group_by(country, year) %>% 
    summarise(us.amount = sum(amount)) %>% 
+0

' GROUP_BY(ドナー、国、年) ' – Mako212

+0

か、新しいグループのカテゴリを作成ドナー==「米国」、「米国」、「米国以外」)、国、年)。 – eipi10

+0

これは、ドナーによる金額の合計で機能します。しかし、私はまだ、その国の年のすべての援助国の合計と、その国の援助の総額との変数を持つ新しい変数を作成することに問題があります。 –

答えて

0

あなたはinner_joinで2つのクエリを結合することができます。 old.dataの1回だけがあるので、この第二の方法は、大規模なデータセットのためにはるかに高速であるべきであり、あなたはそれが道に沿ってサイズだ縮小されています

new.data = old.data %>% 
    group_by(country, year) %>% 
    mutate(sum.amount = sum(amount)) %>% 
    filter(donor == "united states") %>% 
    summarize(sum.amount = max(sum.amount), 
      us.amount = sum(amount)) 

注:

mutate(sum.amount = sum(amount))は同じsum.amountを作成します同じ国の年の組み合わせ内の行summarizeは、米国donorsの各国の年の組み合わせ内でamountを合計することによってus.amountを作成します。このステップでは、私はsummarize(us.amount = sum(amount))sum.amountの列が失われて書いただけです。しかし、私は国別に集計しているので、それを含めるにはsum.amountの集計関数も使用する必要があります。 max(sum.amount)sum.amountはすべて同じ国の年の組み合わせで同じなので、ジョブを実行します。同様に、min(sum.amount)も機能します。

結果:

# A tibble: 3 x 4 
# Groups: country [?] 
    country year sum.amount us.amount 
    <fctr> <int>  <int>  <int> 
1 china 2000  140  90 
2 china 2001  140  90 
3 china 2002  140  90 

データ:( `GROUP_BY(US_donor = ifelse:

old.data = structure(list(country = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L), .Label = "china", class = "factor"), 
    year = c(2000L, 2000L, 2000L, 2000L, 2001L, 2001L, 2001L, 
    2001L, 2002L, 2002L, 2002L, 2002L), donor = c("germany", 
    "france", "united states", "united states", "germany", "france", 
    "united states", "united states", "germany", "france", "united states", 
    "united states"), amount = c(20L, 30L, 40L, 50L, 20L, 30L, 
    40L, 50L, 20L, 30L, 40L, 50L)), class = "data.frame", .Names = c("country", 
"year", "donor", "amount"), row.names = c(NA, -12L)) 
+0

助けてくれてありがとう。私は先に進み、私が探していたものを正確に手に入れました。私は明確化の質問を持っていた。 'max(sum.amount)'の目的は何ですか? –

+0

@TomOkal私の答えが助けてくれてうれしい。説明については、私の更新ノートセクションを参照してください。 – useR

+0

その説明はそれをクリアしました。どうもありがとうございます! –

関連する問題