【问题标题】:How to add the evolution of a given variable as a new variable in a R datatable?如何将给定变量的演变添加为 R 数据表中的新变量?
【发布时间】:2021-02-24 19:23:53
【问题描述】:

我有关于级别变量的数据,看起来像这样:

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 和一些复杂的重新安排来实现,但我认为可能有更好的方法

【问题讨论】:

  • 你有两组年份;应该计算哪一个?
  • 我在中途更换了 MWE,但没有正确操作。每一年都应该是独一无二的

标签: r datatable data-manipulation


【解决方案1】:

仅使用 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

【讨论】:

  • 我的 MWE 有点简化,实际上我有更多的变量,所以实际上手动重新编码变量会很乏味。有没有办法不必这样做?它将如何适用于几个国家?我编辑了我的 MWE 以反映这一点
  • 已编辑,现在您不必重新制作变量。
  • 工作得很好,谢谢。唯一的问题是每个国家的第一次进化值,它被错误地计算,而它应该是NA。不过之后我可以手动纠正它
【解决方案2】:

虽然这不是您要问的,但我认为将进化作为一个新列而不是创建新行更有意义:

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

【讨论】:

  • 如果有必要我仍然可以融化它,然后根据它所在的列更改我的单位。绝对可行
  • 如果有几个国家,有没有办法简单地为每个国家做这件事?与此同时,我正在编辑我的 MWE
【解决方案3】:

因此答案对您可以尝试的任意数量的国家/地区都有效:

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。

【讨论】:

    猜你喜欢
    • 2020-09-07
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多