如果任何连续值不符合阈值,请删除 ID



我的数据框如下所示:

id        year        value
1         2000        23
1         2001        40
1         2003        93
2         1998        90
2         1999        91
2         2002        92
3         2015        12
3         2016        13
3         2017        14

如果有任何两个连续值不符合阈值 90,我想删除 ID。注意:在这种情况下,连续,仅表示一年后 1 年,不必正好是 1 年后。(例如:ID 1 的 2001 年和 2003 年是连续年份(

输出应仅为 id 2。如果 id 2 具有两个连续值为 <90 的任何实例,它们也将被删除。

id        year        value
2         1998        90
2         1999        91
2         2002        92

也可以做:

library(dplyr)
df %>%
  group_by(id) %>%
  filter(!any(value < 90 & lag(value) < 90))

输出:

# A tibble: 3 x 3
# Groups:   id [1]
     id  year value
  <int> <int> <int>
1     2  1998    90
2     2  1999    91
3     2  2002    92

此解决方案使用包dplyr

library(dplyr)
df1 %>%
  group_by(id) %>%
  filter(all(value[-1] >= 90 | value[-n()] >= 90))
## A tibble: 3 x 3
## Groups:   id [1]
#     id  year value
#  <int> <int> <int>
#1     2  1998    90
#2     2  1999    91
#3     2  2002    92

数据。

df1 <- read.table(text = "
id        year        value
1         2000        23
1         2001        40
1         2003        93
2         1998        90
2         1999        91
2         2002        92
3         2015        12
3         2016        13
3         2017        14                  
", header = TRUE)

使用 dplyr 可以首先标识小于 90 的值。然后,您可以计算序列中有多少条目小于 90。之后,您可以只保留您不观察到 2 个小于 90 的连续值的 id。

library(dplyr)
df %>%
  mutate(value_90 = value < 90) %>%
  group_by(id) %>%
  mutate(n_cons = cumsum(value_90)) %>%
  filter(!any(n_cons == 2)) %>%
  select(id, year, value)
# A tibble: 3 x 3
# Groups:   id [1]
     id  year value
  <dbl> <dbl> <dbl>
1     2  1998    90
2     2  1999    91
3     2  2002    92

使用 dplyr 和 rle ...

library(dplyr)
DT %>% mutate(test = value < 90) %>% group_by(id) %>% filter(
  with(rle(test), !any(lengths >= 2 & values))
) %>% select(-test)
# A tibble: 3 x 3
# Groups:   id [1]
     id  year value
  <int> <int> <int>
1     2  1998    90
2     2  1999    91
3     2  2002    92

最新更新