如何通过通过变量过滤的逻辑表达式进行过滤

How to filter via a logical expression that filters via a variable

我对逻辑表达式与变量的结合使用有疑问。

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

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

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

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

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

首先,您似乎有一个矢量而不是数据框(只有一列)。如果您确实有一个数据框并且只有 运行 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() 结果中的

None 个日期与昨天匹配,因此我在匹配的末尾添加了一个。调用 which() returns 一个 4 告诉您向量中的第四项与昨天的日期相匹配。如果更多的日期匹配,它就会有更多的价值。我将结果保存在“Indices”中

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

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