根据关键列构建当前和上一年之间的差异

时间:2018-06-11 17:11:39

标签: dataframe

我得到了以下df:

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值,如果我的列Name中的观察结果与上一年的上一行有关。例如:对于A:第2行包含2002年。检查第1行中是否有上一年。是的,因为第1行包含2001年。

我现在要做的是,我希望通过使用当前年份的值减去上一年的值除以上一年的值来建立与V2和C2列的观察结果的差异。然后我想将该计算值放在当前年份的同一行中。所以基本上我的keycolum中有一个非na值。

有没有办法做到这一点? :)

谢谢:)

2 个答案:

答案 0 :(得分:1)

df <- data.table::fread(
  "Name   Year    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"
)

library(dplyr)

df %>% 
  mutate_at(vars(V2, C2),
            ~ if_else(is.na(df$KeyC), as.double(.x),(.x - lag(.x)) / lag(.x)))

  Name Year   V2         C2 KeyC
1    A 2001  4.0  7.0000000   NA
2    A 2002 -0.5 -0.9285714    1
3    A 2003  1.0 -0.6000000    0
4    A 2005  3.0  0.3000000   NA
5    B 2004  0.0  0.4000000   NA
6    B 2006  1.0  7.0000000   NA
7    B 2007  1.0 -0.9142857    1
8    C 2002  4.0  4.0000000   NA

如果您愿意,可以在vars()子句中添加其他变量

答案 1 :(得分:1)

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