提取包含不同列中指定值的值

时间:2019-12-03 20:35:36

标签: r dataframe

我有这个数据集:

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,并按日期排序。

2 个答案:

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