我想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)
编辑
我必须对变量名进行一些编辑,请注意。
当您的数据仍为长格式时,先求和,然后展开。这是一个带有虚假数据的示例:
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)
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
如果您有多年的时间,那么在您准备好制作一个漂亮的输出表之前,将其保留为长格式可能会更容易:
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)
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