我有一个关于逻辑表达式与变量结合使用的问题。
假设我有一个数据帧,它有多行,每一行都包含一个保存为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.