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
我有一个数据框,其中包含不同观察者在不同日期测量的形态特征。 我的目标是对数据框进行子集化,以删除某个特定观察者(条件 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