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

问题描述 投票:0回答:2

我有一个大的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
r
2个回答
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()

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 
© www.soinside.com 2019 - 2024. All rights reserved.