R:在另一列的因子级别内,根据日期列对数据框进行子集化

R: Subset a data frame based on a date column, within a factor level of another column

我有一个数据框,其中包含不同观察者在不同日期测量的形态特征。 我的目标是对数据框进行子集化,以删除某个特定观察者(条件 1:在因子水平内)在特定日期(条件 2:低于给定值)之前所做的测量。

这是一个示例数据框,我想在其中删除 "A" 在 2012-06-04 之前所做的测量:

obs <- rep(c("A", "B"), each=5)
date <- rep(c("2012-06-01", "2012-06-02","2012-06-03","2012-06-04","2012-06-05"), times=2)
size <- rnorm(10)
df <- data.frame(date, obs, size)

我尝试使用 subset 函数但无济于事。我相信这一定很容易! 谢谢!

也许这与 subset

subset(df, !(obs == "A" & as.Date(date) < as.Date("2012-06-04")))


#         date obs       size
#4  2012-06-04   A -0.6892431
#5  2012-06-05   A -0.8715875
#6  2012-06-01   B  0.1167215
#7  2012-06-02   B  0.9300228
#8  2012-06-03   B  0.8731350
#9  2012-06-04   B -0.7219468
#10 2012-06-05   B  0.9846479

根据文档:

subset - logical expression indicating elements or rows to keep

所以我们为要保留的行创建一个逻辑向量。

或没有 subset 且逻辑相同:

df[!(df$obs == "A" & as.Date(df$date) < as.Date("2012-06-04")), ]

我们可以使用 filter 来自 tidyverse

library(dplyr)
df %>%
   mutate(date = as.Date(date)) %>%
   filter(!(obs == "A" &  date < as.Date("2012-06-04")))
#        date obs       size
#1 2012-06-04   A  2.0358088
#2 2012-06-05   A  0.2621886
#3 2012-06-01   B  0.3747718
#4 2012-06-02   B -0.7784647
#5 2012-06-03   B  1.0913249
#6 2012-06-04   B -0.4795268
#7 2012-06-05   B  0.6139994