2017-06-21 7 views
3

spread私は、このデータを以下の(最初の12行はここに示しています)列「年」で、国の名前'。その後、2015年R:広げる方法、グループ化する、要約する、突然変異させる方法

CountryName  Days  pCountry  Revenue Orders Year 
United Kingdom 0-1 days India  2604.799 13  2014 
Norway   8-14 days Australia 5631.123 9  2015 
US    31-45 days UAE   970.8324 2  2014 
United Kingdom 4-7 days Austria  94.3814 1  2015 
Norway   8-14 days Slovenia  939.8392 3  2014 
South Korea  46-60 days Germany  1959.4199 15  2014 
UK    8-14 days Poland  1394.9096 6.  2015 
UK    61-90 days Lithuania -170.8035 -1  2015 
US    8-14 days Belize  1687.68 5  2014 
Australia  46-60 days Chile  888.72 2. 0  2014 
US    15-30 days Turkey  2320.7355 8  2014 
Australia  0-1 days Hong Kong 672.1099 2  2015 

から2014から各「COUNTRYNAME」の「受注」の%変化を計算し、私は小さなテストデータフレームでこの作業を行うことができますが、唯一の「合計意味がないような無限のエラーを返すように見えることができます因子のための "または"行のための重複した識別子 "と完全なデータ。 dplyrのドキュメントを読んでから、私があきらめたことを試してみた。誰もこのコードで助けることができます...

data %>% 
    spread(Year, Orders) %>% 
    group_by(CountryName) %>% 
    summarise_all(.funs=c(Sum='sum'), na.rm=TRUE) %>% 
    mutate(percent_inc=100*((`2014_Sum`-`2015_Sum`)/`2014_Sum`)) 

期待される出力は以下のような表になります。 (注:これらの数字は例示するためのものであり、彼らは計算されていない手)

CountryName percent_inc 
UK   34.2 
US   28.2 
Norway  36.1 
...   ... 

編集

私は、変数名にいくつかの編集をしなければならなかったので、予めご了承ください。

+2

サンプルデータを提供してください'dput'と期待通りの結果を使用して – HubertL

答えて

1

あなたのデータはまだロングフォーマットになっていますが、その後に広がります。ここでは、偽のデータとの例を示します

set.seed(2) 
dat = data.frame(Country=sample(LETTERS[1:5], 500, replace=TRUE), 
       Year = sample(2014:2015, 500, replace=TRUE), 
       Orders = sample(-1:20, 500, replace=TRUE)) 

dat %>% group_by(Country, Year) %>% 
    summarise(sum_orders = sum(Orders, na.rm=TRUE)) %>% 
    spread(Year, sum_orders) %>% 
    mutate(Pct = (`2014` - `2015`)/`2014` * 100) 
Country `2014` `2015`  Pct 
1  A 575 599 -4.173913 
2  B 457 486 -6.345733 
3  C 481 319 33.679834 
4  D 423 481 -13.711584 
5  E 528 551 -4.356061 

あなたは複数年持っている場合、それはあなたが素敵な出力テーブルを作成する準備が整うまでちょうど長い形式でそれを維持する方が簡単でしょう。

set.seed(2) 
dat = data.frame(Country=sample(LETTERS[1:5], 500, replace=TRUE), 
       Year = sample(2010:2015, 500, replace=TRUE), 
       Orders = sample(-1:20, 500, replace=TRUE)) 

dat %>% group_by(Country, Year) %>% 
    summarise(sum_orders = sum(Orders, na.rm=TRUE)) %>% 
    group_by(Country) %>% 
    arrange(Country, Year) %>% 
    mutate(Pct = c(NA, -diff(sum_orders))/lag(sum_orders) * 100) 
Country Year sum_orders  Pct 
    <fctr> <int>  <int>  <dbl> 
1  A 2010  205   NA 
2  A 2011  144 29.756098 
3  A 2012  226 -56.944444 
4  A 2013  119 47.345133 
5  A 2014  177 -48.739496 
6  A 2015  303 -71.186441 
7  B 2010  146   NA 
8  B 2011  159 -8.904110 
9  B 2012  152 4.402516 
10  B 2013  180 -18.421053 
# ... with 20 more rows 
+0

私はこれに対してどのように感謝しているかを伝えることはできません - 完全に動作します:) – RDJ

1

これはではありません。は再現性の高い質問はしていませんが、助けてください。

エラー1あなたは理由spreadduplicate identifiers for rowsおそらくこのエラーを取得しています。 spreadNNカラムをユニークな値にしたいが、それらの値を配置するユニークなローを知る必要があります。あなたは、インスタンスの重複値-の組み合わせを、持っている場合:。

CountryName  Days  pCountry   Revenue 
United Kingdom 0-1 days   India  2604.799 
United Kingdom 0-1 days   India  2604.799 

は二度現れ、その後、spreadは、それが中にデータを置くべき行クイックフィックスがspreaddata %>% mutate(row=row_number()) %>% spread...にある混乱します。

エラー2あなたは理由summarise_allsum not meaningful for factorsおそらくこのエラーを取得しています。 summarise_allはすべての列で動作しますが、一部の列には文字列(または係数)が含まれます。 United Kingdom + United Kingdomとは何ですか?代わりにsummarise(2014_Sum = sum(2014), 2015_Sum = sum(2015))を入力してください。

関連する問題