我有一个包含三列的数据框,其中第一列是ID,第二列表示年份,第三列是与该年度ID相关联的值:
df_in <- data.frame("ID"=c(1,1,1,1,1,1,
2,2,2,2,
3,3,3),
"yr"=c(2001,2002,2003,2004,2005,2006,
2002,2003,2004,2005,
2003,2004,2005),
"val"=c(1,2,3,4,5,6,
4,5,6,7,
7,8,9))
我想在每个ID的val
- 列中引入延迟,因此查看(例如)ID==1
然后yr==2002
处的值应转移到yr==2001
},yr==2003
到yr==2002
等等。这应该是所有唯一ID的情况。
应删除与上一年相对应的行(现在由于班次而没有值)。我们最终以
结束df_out <- data.frame("ID"=c(1,1,1,1,1,
2,2,2,
3,3),
"yr"=c(2001,2002,2003,2004,2005,
2002,2003,2004,
2003,2004),
"val"=c(2,3,4,5,6,
5,6,7,
8,9))
在dplyr
中有一种简单的方法吗?
答案 0 :(得分:2)
df_out <-
df_in %>%
group_by(ID) %>%
mutate(yr = lag(yr)) %>%
filter(!is.na(yr)) %>%
ungroup
答案 1 :(得分:2)
要获取请求的结果,您可以使用do
:
df_in %>%
group_by(ID) %>%
do(data.frame(yr = head(.$yr, -1L), val = tail(.$val, -1L)))
结果:
# A tibble: 10 x 3
# Groups: ID [3]
ID yr val
<dbl> <dbl> <dbl>
1 1.00 2001 2.00
2 1.00 2002 3.00
3 1.00 2003 4.00
4 1.00 2004 5.00
5 1.00 2005 6.00
6 2.00 2002 5.00
7 2.00 2003 6.00
8 2.00 2004 7.00
9 3.00 2003 8.00
10 3.00 2004 9.00