消除在前面的行的多个列之一中具有匹配项的行

时间:2019-02-15 10:59:04

标签: r

我有一个很大的data.frame。这里是一个更简单的版本,用于更加清晰。

ID <- rep(c(1,2,3),each=4)
Bed <- rep(c(1,1,2,2),3)
ERRBeg <- c(90,140,190,200,290,340,390,100,490,540,560,610)
POST1Beg <- c(100,150,200,250,300,350,400,450,500,550,600,650)
POST2Beg <- c(110,160,210,260,310,360,410,460,510,560,610,660)
DATA <- data.frame(ID,Bed,ERRBeg,POST1Beg,POST2Beg)

看起来像这样:

我要删除具有以下匹配项的所有行: ERRBeg的值可以在前一行的POST1Beg或POST2Beg(我有更多变量)中找到(仅当ID和Bed相同时)

      ID   Bed ERRBeg POST1Beg POST2Beg LAG_ERRBeg LAG_POST1Beg
   <dbl> <dbl>  <dbl>    <dbl>    <dbl>      <dbl>        <dbl>
 1     1     1     90      100      110         NA           NA
 2     1     1    140      150      160         90          100
 3     1     2    190      200      210         NA           NA
 4     1     2    200      250      260        190          200
 5     2     1    290      300      310         NA           NA
 6     2     1    340      350      360        290          300
 7     2     2    390      400      410         NA           NA
 8     2     2    100      450      460        390          400
 9     3     1    490      500      510         NA           NA
10     3     1    540      550      560        490          500
11     3     2    560      600      610         NA           NA
12     3     2    610      650      660        560          600

我尝试过这给了我两个变量匹配的确切行。但是,如果我使用filter(!ERRBeg == lag(POST1Beg))转过头来,它将删除ID和Bed重复的所有行。

DATA %>%
  group_by(ID, Bed)%>%
  filter(ERRBeg == lag(POST1Beg) ) %>%
  ungroup()

我也尝试了这不起作用。我知道我可能缺少一些琐碎的东西,但我看不到。

DATA_xx <- DATA %>%
  group_by(ID, Bed)%>%
  filter(ERRBeg %in% c(lag(ERRBeg),lag(POST1Beg)) ) %>%
  ungroup()

所需的输出:

      ID   Bed ERRBeg POST1Beg POST2Beg LAG_ERRBeg LAG_POST1Beg
   <dbl> <dbl>  <dbl>    <dbl>    <dbl>      <dbl>        <dbl>
 1     1     1     90      100      110         NA           NA
 2     1     1    140      150      160         90          100
 3     1     2    190      200      210         NA           NA
 5     2     1    290      300      310         NA           NA
 6     2     1    340      350      360        290          300
 7     2     2    390      400      410         NA           NA
 8     2     2    100      450      460        390          400
 9     3     1    490      500      510         NA           NA
10     3     1    540      550      560        490          500
11     3     2    560      600      610         NA           NA

2 个答案:

答案 0 :(得分:1)

DATA %>%
group_by(ID, Bed)%>%
filter(!ERRBeg %in% POST1Beg ) %>%
ungroup()

我尝试过将延迟切换为in,并且我认为它有效 编辑:如果ERRBeg值稍后出现在POST1Beg中,则该值将无法继续工作。
  我相信

 DATA %>%
 group_by(ID, Bed)%>%
 filter(!ERRBeg %in% lag(POST1Beg) ) %>%
 ungroup()

答案 1 :(得分:0)

找到了问题和解决方案。 :)

DATA %>%
  group_by(ID, Bed)%>%
  filter(!ERRBeg %in% c(lag(ERRBeg),lag(POST1Beg),lag(POST2Beg)) | is.na(lag(ERRBeg))  ) %>%
  ungroup()

问题在于我不仅得到TRUE,FALSE,而且由于过滤器中的方程式而得到NA。

      ID   Bed ERRBeg POST1Beg POST2Beg FILTER
   <dbl> <dbl>  <dbl>    <dbl>    <dbl> <lgl> 
 1     1     1     90      100      110 NA    
 2     1     1    140      150      160 FALSE 
 3     1     2    190      200      210 NA    
 4     2     1    290      300      310 NA    
 5     2     1    340      350      360 FALSE 
 6     2     2    390      400      410 NA    
 7     2     2    100      450      460 FALSE 
 8     3     1    490      500      510 NA    
 9     3     1    540      550      560 FALSE 
10     3     2    560      600      610 NA