首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将给定变量的演变添加为R数据表中的新变量?

如何将给定变量的演变添加为R数据表中的新变量?
EN

Stack Overflow用户
提问于 2020-11-12 18:40:20
回答 3查看 38关注 0票数 0

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

代码语言:javascript
复制
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行),最后一行是:

代码语言:javascript
复制
Country="France", "Variable"=GDP",Unit="%", year="2019", Value=Valueinlevel(2019)/ValueinLevel(2018)-1  

我想我可以通过dcast和一些复杂的重新安排来达到这个目的,但是我想也许有一个更好的方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-11-12 19:18:11

编辑后只需使用mutate,这样您就不必重新生成其他变量:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2020-11-12 19:11:28

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

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2020-11-12 19:32:18

所以这个答案也适用于你可以尝试的任何国家:

代码语言:javascript
复制
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填充每个国家的第一个例子。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64809848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档