假设我有以下数据。
df = data.frame(name = c("A","A","A","B","B","B","B"),
date = c("2011-01-01","2011-03-01","2011-05-01",
"2011-01-01","2011-05-01","2011-06-01",
"2011-07-01"))
df
我知道数据集中的最后一个日期,并且只想选择那些数据可用于最后日期的名称。所以在上面的例子中,最后一个日期仅适用于名称B.因此,我只想选择名称B的行。
我可以做这样的简单黑客来获得理想的结果。
last_date = "2011-07-01"
#unique(df$name[df$date %in% last_date])
df[df$name %in% unique(df$name[df$date %in% last_date]),]
但是,我想知道是否有针对此任务的dplyr / tidyverse或data.table解决方案。
答案 0 :(得分:3)
有多种方法可以执行此操作,dplyr
我们只能过滤那些last_date
library(dplyr)
df %>%
group_by(name) %>%
filter(last_date %in% date)
# name date
# <fct> <fct>
#1 B 2011-01-01
#2 B 2011-05-01
#3 B 2011-06-01
#4 B 2011-07-01
或类似地在基地R:
df[ave(df$date, df$name, FUN = function(x) last_date %in% x) == TRUE,]
此外,我们可以获取您找到name
的所有last_date
,并从原始数据框中过滤这些name
。
df[with(df, name %in% name[date %in% last_date]), ]