R:如何同时传播,分组,汇总和变异

RDJ*_*RDJ 5 r dplyr tidyr

我想spread通过“年”列在下面获取此数据(仅在此处显示前12行),并返回按“国家/地区名称”分组的“订单”总数。然后计算2014年至2015年每个“国家/地区名称”在“订单”中的变化百分比。

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
Run Code Online (Sandbox Code Playgroud)

我可以使用较小的测试数据框进行此操作,但似乎只能返回无尽的错误,例如“完整的数据对因素无意义”或“行的重复标识符”。经过数小时的阅读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`))
Run Code Online (Sandbox Code Playgroud)

预期的输出将是一个类似于以下的表格。(注意:这些数字仅供参考,并非人工计算。)

CountryName  percent_inc
UK           34.2
US           28.2
Norway       36.1
...          ...
Run Code Online (Sandbox Code Playgroud)

编辑

我必须对变量名进行一些编辑,请注意。

eip*_*i10 5

当您的数据仍为长格式时,先求和,然后展开。这是一个带有虚假数据的示例:

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)
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)

如果您有多年的时间,那么在您准备好制作一个漂亮的输出表之前,将其保留为长格式可能会更容易:

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) 
Run Code Online (Sandbox Code Playgroud)
   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
Run Code Online (Sandbox Code Playgroud)