我的数据框如下:
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
答案 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