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

R 如果任何连续值不符合阈值,请删除ID,r,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 2

我的数据框如下所示:

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有两个连续值为的任何实例,则此解决方案使用包
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
库(dplyr)
df1%>%
分组依据(id)%>%
过滤器(全部(值[-1]>=90 |值[-n()]>=90))
##一个tibble:3x3
##分组:id[1]
#id年份值
#    
#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)

df1使用
dplyr
可以首先识别小于90的值。然后,您可以计算序列中小于90的条目数。之后,您可以只保留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
库(dplyr)
df%>%
变异(值_90=值<90)%>%
分组依据(id)%>%
变异(n_cons=cumsum(值_90))%>%
筛选器(!任意(n_cons==2))%>%
选择(id、年份、值)
#一个tibble:3x3
#分组:id[1]
id年份值
1     2  1998    90
2     2  1999    91
3     2  2002    92
还可以执行以下操作:

library(dplyr)

df %>%
  group_by(id) %>%
  filter(!any(value < 90 & lag(value) < 90))
库(dplyr)
df%>%
分组依据(id)%>%
过滤器(!任意(值<90和滞后(值)<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
#一个tible:3 x 3
#分组:id[1]
id年份值
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
库(dplyr)
DT%%>%变异(测试=值<90)%%>%group\U by(id)%%>%filter(
带(rle(测试),!任意(长度>=2和值))
)%%>%选择(-test)
#一个tibble:3x3
#分组:id[1]
id年份值
1     2  1998    90
2     2  1999    91
3     2  2002    92

欢迎来到SO!到目前为止你试过什么?你被卡在哪里了?请修改您的问题以符合a的标准。分组将其转换为要显示更漂亮结果的
TIBLE
,您只需在结尾执行
%>%as.data.frame()
。@arg0naut我删除向量的第一个元素和最后一个
n()
。因此,得到的两个向量是滞后的,或者是“或”
value[2]
value[1]
,然后是3和2,以此类推。
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