Dataframe 基于关键列从中构建当前和上一年之间的差异
我得到了以下结果:Dataframe 基于关键列从中构建当前和上一年之间的差异,dataframe,Dataframe,我得到了以下结果: Name Year [Columns which should stay like that] V2 C2 KeyC A 2001 ... 4 7 NA A 2002 ... 2 0.5 1 A 2003 ...
Name Year [Columns which should stay like that] V2 C2 KeyC
A 2001 ... 4 7 NA
A 2002 ... 2 0.5 1
A 2003 ... 4 0.2 0
A 2005 ... 3 0.3 NA
B 2004 ... 0 0.4 NA
B 2006 ... 1 7 NA
B 2007 ... 2 0.6 1
C 2002 .... 4 4 NA
因此,我们的想法如下。我有一个列KeyC,其中包含一个非Na值,如果我的列名中的观察值在上一年的前一行中。例如:对于A:第2行包含2002年。检查第1行是否有上一年。是的,因为第一行包含2001
我现在想做的是,我想通过使用本年的值减去上一年的值除以上一年的值,来建立V2和C2列观测值的差值。然后我想把计算出的值放在今年的同一行。基本上,在我的键盘柱中有一个非na值
有办法做到这一点吗?:)
谢谢:)df%
变异_at(vars(V2,C2),
~if_else(is.na(df$KeyC),as.double(.x),(.x-lag(.x))/lag(.x)))
名称年份V2 C2键C
1A 2001年4.070000000北美
2 A 2002-0.5-0.9285714 1
3 A 2003 1.0-0.6000000
4 A 2005年3.0 0 300万不适用
5 B 2004 0.0 0 0.4000000 NA
6b 2006年1.070000000北美
7 B 2007 1.0-0.9142857 1
8 C 2002 4.0 4.0000000 NA
如果愿意,可以向vars()
子句添加其他变量
dat%>%
group_by(Name)%>%
mutate(i=c(0,diff(Year))==1,
V2= ifelse(i,(V2-lag(V2))/lag(V2),V2),
C2= ifelse(i,(C2-lag(C2))/lag(C2),C2),
i=NULL)
# A tibble: 8 x 6
# Groups: Name [3]
Name Year X.Columns.which.should.stay.like.that. V2 C2 KeyC
<fct> <int> <fct> <dbl> <dbl> <int>
1 A 2001 ... 4.00 7.00 NA
2 A 2002 ... -0.500 -0.929 1
3 A 2003 ... 1.00 -0.600 0
4 A 2005 ... 3.00 0.300 NA
5 B 2004 ... 0. 0.400 NA
6 B 2006 ... 1.00 7.00 NA
7 B 2007 ... 1.00 -0.914 1
8 C 2002 .... 4.00 4.00 NA
分组单位(名称)%>%
变异(i=c(0,差异(年))==1,
V2=ifelse(i,(V2滞后(V2))/滞后(V2),V2),
C2=ifelse(i,(C2滞后(C2))/滞后(C2),C2),
i=空)
#一个tibble:8x6
#分组:名称[3]
命名年份X.Columns.which.should.stay.like.that。V2 C2键
1 A 2001。。。4.00 7.00北美
2002年2月A日-0.500 -0.929 1
3 A 2003。。。1.00 -0.600 0
4 A 2005。。。3.00 0.300纳
5 B 2004年。。。00.400纳
2006年6月B日。。。1.00 7.00北美
2007年7月B日。。。1.00 -0.914 1
8 C 2002。。。。4.00 4.00北美
请注意:
KeyC
,需要现场安装@Onyanbu的答案实现了对Name
组和后续年份的检查,这是一个很好的选择。也许将他的答案与调用的mutate_结合起来,可以让您更轻松地将解决方案扩展到更多变量。
dat%>%
group_by(Name)%>%
mutate(i=c(0,diff(Year))==1,
V2= ifelse(i,(V2-lag(V2))/lag(V2),V2),
C2= ifelse(i,(C2-lag(C2))/lag(C2),C2),
i=NULL)
# A tibble: 8 x 6
# Groups: Name [3]
Name Year X.Columns.which.should.stay.like.that. V2 C2 KeyC
<fct> <int> <fct> <dbl> <dbl> <int>
1 A 2001 ... 4.00 7.00 NA
2 A 2002 ... -0.500 -0.929 1
3 A 2003 ... 1.00 -0.600 0
4 A 2005 ... 3.00 0.300 NA
5 B 2004 ... 0. 0.400 NA
6 B 2006 ... 1.00 7.00 NA
7 B 2007 ... 1.00 -0.914 1
8 C 2002 .... 4.00 4.00 NA