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

时间:2019-02-07 20:49:48

标签: r

我的数据框如下:

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。注意:在这种情况下,连续表示仅隔一年后,而不必等于后一年。 (例如:ID为1的2001和2003是连续的年份)

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

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

4 个答案:

答案 0 :(得分:3)

还可以:

~

输出:

library(dplyr)

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

答案 1 :(得分:2)

此解决方案使用软件包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)

答案 2 :(得分:0)

使用dplyr,您可以首先识别小于90的值。然后您可以计算顺序有多少个小于90的条目。之后,您可以仅保留未观察到2的ID。连续值小于90。

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

答案 3 :(得分:0)

使用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