我在R与dplyr一起工作。示例df:
set.seed(43)
x <- data.frame(Country = rep(c("China","USA","France"), each = 3),
Year = rep(2003:2005,3)
Value = sample(0:10, 9, replace = TRUE))
X:
Country Year Value
China 2003 4
China 2004 10
China 2005 8
USA 2003 1
USA 2004 3
USA 2005 1
France 2003 5
France 2004 0
France 2005 7
我想创建另一个列,显示给定国家/地区和年份的一年差异,其中起始年份应为NA:
Country Year Change Value
China 2003 NA 4
China 2004 6 10
China 2005 -2 8
France 2003 NA 5
France 2004 -5 0
France 2005 7 7
USA 2003 NA 1
USA 2004 2 3
USA 2005 -2 1
理想的解决方案是,在单个mutate()
语句中,使用行的Year
和Country
来查找前一年的行的Value
在同一个国家,然后计算差异。我不确定这是否可行。我有一个工作(可怕)的解决方案,依赖于传播/收集数据:
x %>%
spread(Year,Value) %>%
transmute(Country,
`2005` = `2005` - `2004`,
`2004` = `2004` - `2003`,
`2003` = NA) %>%
gather("Year","Change", 2:4) %>%
mutate(Year = as.integer(Year)) %>%
left_join(x) %>%
arrange(Country, Year)
然而,在我的实际数据中,有多年的代表性,有些国家的价值观比其他国家多。我还将不仅仅需要匹配的Country
键值。是否有更简洁的方法来进行此计算?