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