我得到了以下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值。
有没有办法做到这一点? :)
谢谢:)
答案 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