Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dataframe 基于关键列从中构建当前和上一年之间的差异_Dataframe - Fatal编程技术网

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