每个ID

时间:2018-01-16 19:05:06

标签: r dplyr

我有一个包含三列的数据框,其中第一列是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==2003yr==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中有一种简单的方法吗?

2 个答案:

答案 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