case_number <- c("1", "1", "2", "2", "2", "3", "3")
type <- c("STD", "STD2", "STD", "STD3", "STD2", "STD", "STD2")
date <- as.Date(c('2008-11-1','2009-3-25','2010-3-14',"2010-10-14","2010-11-14", '2015-3-14', '2015-4-15'))
data <- data.frame(case_number,type, date)
我想知道如何提取按日期排序的,case_number
和STD
彼此相邻的唯一STD2
?
在这种情况下,将是1和3,因为对于2,STD3
出现在STD1
和STD2
之间。
答案 0 :(得分:1)
这是一个镜头:
myfilter <- function(x) {
r <- rle(x %in% c("STD", "STD2"))
any(r$lengths[r$values] > 1)
}
library(dplyr)
data %>%
group_by(case_number) %>%
filter(myfilter(type)) %>%
ungroup()
# # A tibble: 4 x 3
# case_number type date
# <fct> <fct> <date>
# 1 1 STD 2008-11-01
# 2 1 STD2 2009-03-25
# 3 3 STD 2015-03-14
# 4 3 STD2 2015-04-15
它不在乎顺序,而只是在两个(或更多)链中找到它们中的一个。
答案 1 :(得分:1)
假设每个case_number
都具有两个值,另一种选择是检查"STD"
和"STD2"
的位置并选择差值等于1的组。
check_fun <- function(x) {
abs(diff(c(which.max(x == "STD"), which.max(x == "STD2")))) == 1
}
library(dplyr)
data %>% group_by(case_number) %>% filter(check_fun(type))
# case_number type date
# <fct> <fct> <date>
#1 1 STD 2008-11-01
#2 1 STD2 2009-03-25
#3 3 STD 2015-03-14
#4 3 STD2 2015-04-15
或者如果您只需要唯一的case_number
data %>%
group_by(case_number) %>%
filter(check_fun(type)) %>%
pull(case_number) %>%
unique
#[1] 1 3
#Levels: 1 2 3