我有关于级别变量的数据,看起来是这样的:
library(data.table)
> MWE <- data.table(
+ Country=c(rep("France",10), rep("Germany",10)),
+ Variable="GDP",
+ Unit="M€ ",
+ year=as.character(seq(2010,2019)),
+ Value=rnorm(20,1,2))
> MWE
Country Variable Unit year Value
1: France GDP M€ 2010 0.2475945
2: France GDP M€ 2011 -0.1812476
3: France GDP M€ 2012 -1.0828806
4: France GDP M€ 2013 1.1369641
5: France GDP M€ 2014 1.8484673
6: France GDP M€ 2015 0.3989246
7: France GDP M€ 2016 2.9233374
8: France GDP M€ 2017 0.2926139
9: France GDP M€ 2018 -0.2150575
10: France GDP M€ 2019 -5.1984673
11: Germany GDP M€ 2010 -0.5920364
12: Germany GDP M€ 2011 2.3122961
13: Germany GDP M€ 2012 3.2274544
14: Germany GDP M€ 2013 2.7092847
15: Germany GDP M€ 2014 -3.0176760
16: Germany GDP M€ 2015 0.7516344
17: Germany GDP M€ 2016 1.1884167
18: Germany GDP M€ 2017 3.6750553
19: Germany GDP M€ 2018 2.1837976
20: Germany GDP M€ 2019 0.4049757我也希望从过去一年的演变成为一个新的路线,为每年。
因此,我的最终数据表将有双行数(这里有40行),最后一行是:
Country="France", "Variable"=GDP",Unit="%", year="2019", Value=Valueinlevel(2019)/ValueinLevel(2018)-1 我想我可以通过dcast和一些复杂的重新安排来达到这个目的,但是我想也许有一个更好的方法。
发布于 2020-11-12 19:18:11
编辑后只需使用mutate,这样您就不必重新生成其他变量:
df <- bind_rows(MWE,
MWE %>% arrange(Country, year) %>%
group_by(Country) %>%
mutate(Unit = "%",
Value = Value/lag(Value)))
head(df)
Country Variable Unit year Value
1: France GDP M€ 2010 -0.1619532
2: France GDP M€ 2011 1.8810795
3: France GDP M€ 2012 -2.5558978
4: France GDP M€ 2013 0.6677455
5: France GDP M€ 2014 0.4666320
6: France GDP M€ 2015 2.4144170发布于 2020-11-12 19:11:28
虽然这不是您所要求的,但我认为将演化作为一个新列而不是创建新行更有意义:
MWE$evolution = c(NA, MWE$Value[-1]/MWE$Value[-nrow(MWE)]-1)
head(MWE)
# Country Variable Unit year Value evolution
# 1: France GDP M€ 2010 2.25841420 NA
# 2: France GDP M€ 2011 1.15731238 -0.4875553
# 3: France GDP M€ 2012 -0.84725830 -1.7320913发布于 2020-11-12 19:32:18
所以这个答案也适用于你可以尝试的任何国家:
MWE = MWE[order(MWE$Country, MWE$year),]
MWE$evolution = c(NA, MWE$Value[-1]/MWE$Value[-nrow(MWE)]-1)
MWE[c(F, as.logical(diff(as.numeric(as.factor(MWE$Country))))), "evolution"] = NA基本上,要确保它是按国家和年份订购的。用和我先前的答案相同的方法计算进化。然后用NA填充每个国家的第一个例子。
https://stackoverflow.com/questions/64809848
复制相似问题