根据另一列的条件提取值

时间:2019-12-03 22:18:42

标签: r

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_numberSTD彼此相邻的唯一STD2

在这种情况下,将是1和3,因为对于2,STD3出现在STD1STD2之间。

2 个答案:

答案 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