R语言 在上一行满足条件后删除行

oxf4rvwz  于 2023-11-14  发布在  其他
关注(0)|答案(3)|浏览(126)

我已经搜索了这个问题的所有其他示例,包括但不限于-R: Removing All Rows After Condition Is MetDelete subsequent rows after row meets criteria-我无法使任何示例代码适用于我的数据。
我想删除任何行(按ID分组)>= 140之后的所有行。如果没有行满足条件,则它们全部保留。
示例数据:

ID <- c(1,1,1,1,2,2,2,3,3,3,3)
sBP <- c(130, 139, 140, 141, 120, 122, 123, 140, 126, 127, 130)
DF1 <- data.frame(ID, sBP)

字符串
x1c 0d1x的数据
这是我希望数据看起来像:

任何帮助将不胜感激!

2lpgd968

2lpgd9681#

您共享的第一个链接中的dplyr解决方案可能会根据您的真实的数据抛出警告,但确实有效:

library(dplyr)

DF1 %>%
  filter(row_number() < min(which(sBP >= 140)), .by = ID)
#> Warning: There was 1 warning in `filter()`.
#> ℹ In argument: `row_number() < min(which(sBP >= 140))`.
#> ℹ In group 2: `ID = 2`.
#> Caused by warning in `min()`:
#> ! no non-missing arguments to min; returning Inf
#>   ID sBP
#> 1  1 130
#> 2  1 139
#> 3  2 120
#> 4  2 122
#> 5  2 123

字符串

imzjd6km

imzjd6km2#

以下是purrr的解决方案:

libray(purrr)
library(dplyr)

map_df(
  unique(ID), 
  \(x) tibble(
    id = x, 
    sbp = head_while(sBP[ID == x], \(y) y < 140)))

# A tibble: 5 × 2
     id   sbp
  <dbl> <dbl>
1     1   130
2     1   139
3     2   120
4     2   122
5     2   123

字符串

ecbunoof

ecbunoof3#

或者,请尝试

DF1 <- data.frame(ID, sBP) %>% 
  group_by(ID) %>% 
  mutate(new=ifelse(sBP>=140,1,NA)) %>% 
  fill(new) %>% filter(is.na(new)) %>% 
  select(-new)

字符串
创建于2023-11-09带有reprex v2.0.2

# A tibble: 5 × 2
# Groups:   ID [2]
     ID   sBP
  <dbl> <dbl>
1     1   130
2     1   139
3     2   120
4     2   122
5     2   123

相关问题