我有这个数据集:
case_number <- c("1", "1", "2", "2", "2", "3", "3")
type <- c("STD", "STD2", "STD", "STD2", "STD", "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
作为按日期排序的最后一个类型的唯一"STD2"
?
在这种情况下,将是1和3,因为它们的最后一个类型为STD2,并按日期排序。
答案 0 :(得分:2)
如果只需要数字,则可以使用tapply(假设您的数据已按每个case_number中的日期排序)
case_nums <- with(data, tapply(type == 'STD2', case_number, tail, 1))
names(case_nums)[case_nums]
# [1] "1" "3"
如果您希望将这些case_number子集化,则可以使用dplyr
library(dplyr)
data %>%
group_by(case_number) %>%
filter(type[which.max(date)] == 'STD2')
# # A tibble: 4 x 3
# # Groups: case_number [2]
# 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 :(得分:2)
我们可以使用data.table
:
library(data.table)
setDT(data)[
setDT(data)[,.I[date == max(date)], by = case_number]$V1][
type %in% "STD2"]
#> case_number type date
#> 1: 1 STD2 2009-03-25
#> 2: 3 STD2 2015-04-15