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