r语言 - 如何通过逻辑表达式进行过滤,该逻辑表达式通过变量进行过滤



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

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

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

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

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

  • 使用grep帮助对数据帧进行子集

我很清楚这个问题可能是重复的。然而,目前的问题并没有给我提供我需要的帮助。我希望你们中有人能帮助我。

作为初始问题,看起来您有一个向量而不是数据框架(只有一列)。如果您确实有一个数据帧,并且只在一列上运行str(),那么最后非常类似的技术将为您工作。

首先要知道的是你的日期是以字符串的形式存储的,而你的昨天对象是Date格式的。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,告诉您向量中的第4项与昨天的日期匹配。如果有更多的日期匹配,它将有更多的值。我将结果保存在"索引"中

然后我们可以使用which()的索引来子集你的向量或数据框。

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

最新更新