2017-06-21 24 views
3

我想spread這個數據在下面(僅在這裏顯示的前12行)列'Year',返回'Orders'國家的名字'。然後計算「訂單」的百分比變化爲從2014年起每個「國家或地區名稱」到2015年的R:如何在同一時間傳播,group_by,彙總和變異

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 

我可以用較小的測試數據框這項工作,但只能似乎回到無盡的錯誤,如「和沒有意義因子'或'行的重複標識符'與完整的數據。在閱讀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你得到錯誤duplicate identifiers for rows可能是因爲spreadspread想要爲您的N唯一值創建N列,但它需要知道將哪些唯一行放置這些值。如果您有重複的值組合,例如:

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

顯示了兩次,然後spread會很困惑,哪一行應該將數據放在快速的解決辦法是data %>% mutate(row=row_number()) %>% spread...spread之前。

錯誤2你得到錯誤sum not meaningful for factors可能是因爲summarise_allsummarise_all將在所有列上操作,但某些列包含字符串(或因素)。 United Kingdom + United Kingdom等於什麼?試試summarise(2014_Sum = sum(2014), 2015_Sum = sum(2015))