2017-06-21 23 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))