【问题标题】:R: Subset a data frame based on a date column, within a factor level of another column [duplicate]R:在另一列的因子级别内根据日期列对数据框进行子集[重复]
【发布时间】:2017-12-03 21:11:14
【问题描述】:

我有一个数据框,其中包含由不同观察者在不同日期测量的形态特征。 我的目标是对数据框进行子集化,以删除某个特定观察者(条件 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 函数无济于事。我相信这一定很容易! 谢谢!

【问题讨论】:

  • 您可以在创建数据框后使用以下df$date &lt;- as.Date(df$date)将日期字符串转换为日期格式。这将有助于过滤下游。

标签: r date subset multiple-conditions


【解决方案1】:

也许这个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,逻辑相同:

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

【讨论】:

  • 谢谢,其实我刚刚发现了完全一样的方法,效果很好。
【解决方案2】:

我们可以从tidyverse使用filter

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

【讨论】:

    猜你喜欢
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2023-01-19
    • 2020-10-17
    • 2016-12-15
    • 2013-04-22
    相关资源
    最近更新 更多