【问题标题】:How to filter via a logical expression that filters via a variable [duplicate]如何通过通过变量过滤的逻辑表达式进行过滤[重复]
【发布时间】:2021-11-18 10:29:03
【问题描述】:

我有一个关于将逻辑表达式与变量结合使用的问题。

假设我有一个包含多行的数据框,每行包含保存为2021-09-25T06:04:35:689Z 的日期。

我还有一个变量,其中包含昨天的日期为 '2021-09-24' - yesterday <- Sys.Date()-1

如何根据存储在变量“昨天”中的昨天日期过滤数据框中的行?

为了解决我的问题,我查看了多个帖子,例如:

我很清楚这个问题可能是重复的。但是,当前的问题并没有为我提供我需要帮助的帮助。我希望你们中的一个可以帮助我。

【问题讨论】:

  • 您的过滤条件是什么?日期大于、等于、小于等的任何行比昨天?作为可重复的示例,数据的更多结构也将是有用的。
  • 我想查看时间戳日期等于昨天日期的行。我已经添加了一个示例。
  • 您能否运行str(df),其中“df”是您的数据框的名称并在此处发布结果?
  • @bbernicker 当然:​​chr [1:166779] "2021-09-09T06:04:35.689Z" "2021-09-09T06:04:35.690Z" "2021-09-09T06:04:35.260Z"

标签: r filter grepl


【解决方案1】:

首先,看起来您有一个向量而不是数据框(只有一列)。如果您确实有一个数据框并且只在一列上运行 str(),那么最后非常相似的技术将适用于您。

首先要知道的是,您的日期存储为字符串,而您昨天的对象是日期格式。 R 不会让你比较不同类型的对象,所以你需要至少转换两个对象中的一个。

我建议将两者都转换为 POSIXct 格式,这样您就不会丢失日期列中的任何信息,但仍可以将其与昨天进行比较。确保将时区设置为与您的系统时间相同(我的是“America/New_York”)。

Dates <- c("2021-09-09T06:04:35.689Z", "2021-09-09T06:04:35.690Z", "2021-09-09T06:04:35.260Z", "2021-09-24T06:04:35.260Z")
Dates <- gsub("T", " ", Dates)
Dates <- gsub("Z", "", Dates)
Dates <- as.POSIXct(Dates, '%Y-%m-%d %H:%M:%OS', tz = "America/New_York")

yesterday <- Sys.time()-86400 #the number of seconds in one day

现在你可以告诉 R 忽略时间,只比较日期。

trunc(Dates, units = c("days")) == trunc(yesterday, units = c("days"))]

您问题的另一部分是关于过滤的。最简单的过滤方法是子集。您首先通过将比较包装在 which() 函数中,向 R 询问向量(或列)中匹配值的索引。

Indices <- which(trunc(Dates, units = c("days")) == trunc(yesterday, units = c("days"))])

你的 str() 结果中没有一个日期与昨天匹配,所以我在最后添加了一个匹配的日期。调用 which() 返回一个 4 来告诉您向量中的第四项与昨天的日期匹配。如果更多日期匹配,它将具有更多值。我将结果保存在“索引”中

然后我们可以使用来自which() 的索引来对您的向量或数据框进行子集化。

Filtered_Dates <- Dates[Indices]
Filtered_Dataframe <- df[Indices,] #note the comma, which indicates that we are filtering rows instead of columns.

【讨论】:

  • 感谢您的帮助和精彩的解释!它就像一个魅力!
  • 我很高兴听到这个消息。祝你的项目好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 2013-02-25
相关资源
最近更新 更多