R 选择列更改超过阈值的行

R 选择列更改超过阈值的行,r,dplyr,R,Dplyr,我有一个包含三列的数据框,其中第一列是一个ID,第二列表示一年,第三列是与该年ID关联的值: df.in <- data.frame("id"=c(1,1,1,1,1, 2,2,2,2,2,2, 3,3,3,3,3,3,3), "yr"=c(2005,2006,2007,2008,2010, 2001,2002,2003,2006,2008,2009, 2001, 2002,2003,2004,2005,2007,2009),

我有一个包含三列的数据框,其中第一列是一个ID,第二列表示一年,第三列是与该年ID关联的值:

df.in <- data.frame("id"=c(1,1,1,1,1, 2,2,2,2,2,2, 3,3,3,3,3,3,3),
                    "yr"=c(2005,2006,2007,2008,2010, 2001,2002,2003,2006,2008,2009, 2001, 2002,2003,2004,2005,2007,2009),
                    "val"=c(5,6,7,8,10, 1,2,3,6,8,10, 1,2,3,4,5,7,9))

使用
lag

df.in %>% filter(val - lag(val) > 1)
基于@Sotos和@akrun,将代码从使用
val
更改为
yr

df.in <- data.frame("id"=c(1,1,1,1,1, 2,2,2,2,2,2, 3,3,3,3,3,3,3),
                    "yr"=c(2005,2006,2007,2008,2010, 2001,2002,2003,2006,2008,2010, 2001, 2002,2003,2004,2005,2007,2009),
                    "val"=c(5,6,7,8,10, 1,2,3,6,8,10, 1,2,3,4,5,7,9))

df.out <- data.frame("id"=c(1,1,1,1, 2,2,2,2, 3,3,3,3,3),
                     "yr"=c(2005,2006,2007,2008, 2001,2002,2003,2006,2001, 2002,2003,2004,2005),
                     "val"=c(5,6,7,8, 1,2,3,6, 1,2,3,4,5))


#output

df.out <- df.in %>% group_by(id) %>% filter((yr - lag(yr, default = yr[1]) <= 1))

df.out

#ignored

df.ignored <- df.in %>% group_by(id) %>% filter((yr - lag(yr, default = yr[1]) > 1))

df.ignored
df.in(1))
忽略
输出:

> df.out
# A tibble: 12 x 3
# Groups: id [3]
      id    yr   val
   <dbl> <dbl> <dbl>
 1  1.00  2005  5.00
 2  1.00  2006  6.00
 3  1.00  2007  7.00
 4  1.00  2008  8.00
 5  2.00  2001  1.00
 6  2.00  2002  2.00
 7  2.00  2003  3.00
 8  3.00  2001  1.00
 9  3.00  2002  2.00
10  3.00  2003  3.00
11  3.00  2004  4.00
12  3.00  2005  5.00
> df.ignored
# A tibble: 6 x 3
# Groups: id [3]
     id    yr   val
  <dbl> <dbl> <dbl>
1  1.00  2010 10.0 
2  2.00  2006  6.00
3  2.00  2008  8.00
4  2.00  2010 10.0 
5  3.00  2007  7.00
6  3.00  2009  9.00
>df.out
#一个tibble:12x3
#组别:id[3]
id yr val
1  1.00  2005  5.00
2  1.00  2006  6.00
3  1.00  2007  7.00
4  1.00  2008  8.00
5  2.00  2001  1.00
6  2.00  2002  2.00
7  2.00  2003  3.00
8  3.00  2001  1.00
9  3.00  2002  2.00
10  3.00  2003  3.00
11  3.00  2004  4.00
12  3.00  2005  5.00
>忽略
#一个tibble:6x3
#组别:id[3]
id yr val
1  1.00  2010 10.0 
2  2.00  2006  6.00
3  2.00  2008  8.00
4  2.00  2010 10.0 
5  3.00  2007  7.00
6  3.00  2009  9.00

根据您的规则使用
延迟进行筛选

df.in %>% filter(val - lag(val) > 1)
基于@Sotos和@akrun,将代码从使用
val
更改为
yr

df.in <- data.frame("id"=c(1,1,1,1,1, 2,2,2,2,2,2, 3,3,3,3,3,3,3),
                    "yr"=c(2005,2006,2007,2008,2010, 2001,2002,2003,2006,2008,2010, 2001, 2002,2003,2004,2005,2007,2009),
                    "val"=c(5,6,7,8,10, 1,2,3,6,8,10, 1,2,3,4,5,7,9))

df.out <- data.frame("id"=c(1,1,1,1, 2,2,2,2, 3,3,3,3,3),
                     "yr"=c(2005,2006,2007,2008, 2001,2002,2003,2006,2001, 2002,2003,2004,2005),
                     "val"=c(5,6,7,8, 1,2,3,6, 1,2,3,4,5))


#output

df.out <- df.in %>% group_by(id) %>% filter((yr - lag(yr, default = yr[1]) <= 1))

df.out

#ignored

df.ignored <- df.in %>% group_by(id) %>% filter((yr - lag(yr, default = yr[1]) > 1))

df.ignored
df.in(1))
忽略
输出:

> df.out
# A tibble: 12 x 3
# Groups: id [3]
      id    yr   val
   <dbl> <dbl> <dbl>
 1  1.00  2005  5.00
 2  1.00  2006  6.00
 3  1.00  2007  7.00
 4  1.00  2008  8.00
 5  2.00  2001  1.00
 6  2.00  2002  2.00
 7  2.00  2003  3.00
 8  3.00  2001  1.00
 9  3.00  2002  2.00
10  3.00  2003  3.00
11  3.00  2004  4.00
12  3.00  2005  5.00
> df.ignored
# A tibble: 6 x 3
# Groups: id [3]
     id    yr   val
  <dbl> <dbl> <dbl>
1  1.00  2010 10.0 
2  2.00  2006  6.00
3  2.00  2008  8.00
4  2.00  2010 10.0 
5  3.00  2007  7.00
6  3.00  2009  9.00
>df.out
#一个tibble:12x3
#组别:id[3]
id yr val
1  1.00  2005  5.00
2  1.00  2006  6.00
3  1.00  2007  7.00
4  1.00  2008  8.00
5  2.00  2001  1.00
6  2.00  2002  2.00
7  2.00  2003  3.00
8  3.00  2001  1.00
9  3.00  2002  2.00
10  3.00  2003  3.00
11  3.00  2004  4.00
12  3.00  2005  5.00
>忽略
#一个tibble:6x3
#组别:id[3]
id yr val
1  1.00  2010 10.0 
2  2.00  2006  6.00
3  2.00  2008  8.00
4  2.00  2010 10.0 
5  3.00  2007  7.00
6  3.00  2009  9.00

为什么第9行在输出中?@akrun这是我的错别字,sorry@N08答案对你的问题有帮助吗?为什么第9行在输出中?@akrun这是我的错别字,sorry@N08答案对你的问题有帮助吗?@Sotos没有,它会错过第一排。它将是
df.in%>%filter(val-lag(val,default=val[1])@Sotos同样,我认为OP提到的是
yr
,而不是
val
。可能
val
是基于data@akrun没错。我认为瓦尔只是(20**)之后的角色这使得
diff
更加明显。@N08在输出中有1-2008-8并同时丢弃的逻辑是什么?@N08为什么不在丢弃中有2-2006呢?它不是在2003年之后出现的,这意味着它应该被丢弃吗?@Sotos不,它将错过第一行。它将是
df.in%>%过滤器(val-lag(val,default=val[1])@Sotos同样,我认为OP提到的是
yr
而不是
val
。可能
val
是基于data@akrun没错。我认为瓦尔只是(20**)之后的角色哪个选项可以使
diff
更加明显。@N08在输出中有1-2008-8并同时丢弃它背后的逻辑是什么?@N08为什么在丢弃中没有2-2006?它不是在2003年之后出现的,这意味着它应该被丢弃吗?