【问题标题】:Filter dates in R with dplyr使用 dplyr 过滤 R 中的日期
【发布时间】:2017-04-23 14:19:22
【问题描述】:

我有一个大型数据集(> 3k 行),我想根据地理位置和日期进行过滤。位置过滤工作正常,但在 filter (dplyr) 的日期上使用逻辑运算符时出现以下错误消息:

Error: level sets of factors are different

我目前的代码如下:

head(master.data)
   State.Name County.Code Latitude Longitude Arithmetic.Mean Date.Local
1     Alabama           3 30.49748 -87.88026             8.0 2014-01-02
2     Alabama           3 30.49748 -87.88026             7.0 2014-01-05
3     Alabama           3 30.49748 -87.88026             7.0 2014-01-08
4     Alabama           3 30.49748 -87.88026             3.6 2014-01-11
5     Alabama           3 30.49748 -87.88026             5.2 2014-01-14
6     Alabama           3 30.49748 -87.88026             4.4 2014-01-17  

master.data$Date.Local <- as.Date(master.data$Date.Local, format = "%Y-%m-%d")

site.info <- data.frame("Alabama", 3, 30, 90, "28/12/2015", "13/07/2016")
names(site.info) <- c("State.Name", "County.Code", "Latitude", "Longitude", 
                       "Date.Start", "Date.End")
site.info$Date.Start <- as.Date(site.info$Date.Start, format = "%d/%m/%Y")
site.info$Date.End <- as.Date(site.info$Date.End, format = "%d/%m/%Y")

reduced.data <- filter(master.data, State.Name == site.info$State.Name, 
                       Date.Local >= site.info$Date.Start 
                       & Date.Local <= site.info$Date.End)

site.infomaster.data 都使用as.Date 格式化日期。输入格式不同,因为它们是从外部源导入的。

我能够对两者执行逻辑运算,预期结果在filter 之外。不知道为什么会这样。使用%in% 产生相同的结果

Date.Local %in% c(site.info$Date.Start, site.info$Date.End)

我怎样才能让它工作?

【问题讨论】:

  • 我认为如果“site.info”中有更多元素并且是factor 类,您的State.Name == site.info$State.Name 可能会令人不安。你可以试试join。这可以使用data.table 更轻松地完成,即setDT(master.data)[site.info, on = .(State.Name, Date.Local &gt;= Date.Start, Date.Local &lt;=Date.End)]
  • 我也试试这个。 site.info 不超过 12 行,日期使用 as.Date 格式化,所以我很好奇它为什么不起作用。
  • 您的 State.Name 列可能是一个因素 - 每个 data.frame 中的级别不同。如果您在问题中包含dput(head(master.data)),我们可以确定。除非您希望将此列作为一个因素,否则不要让它成为一个因素。 EG 在read.table 中使用stringsAsFactors = FALSE
  • @Richard 你是对的,State.Name 确实是一个因素。输出太长,无法在此处打印。其他是 int' or num` 除了 Date.Localdate
  • 两种方法都试过了,还是不行。还有其他建议吗?

标签: r filter dplyr


【解决方案1】:

经过多次尝试,在这种情况下,subset 似乎比filter 效果更好:

 reduced.data <- subset(master.data, Latitude %in% closest.sites$Latitude
                        & Longitude %in% closest.sites$Longitude
                        & Date.Local >= site.info$Date.Start 
                        & Date.Local <= site.info$Date.End)

上面的代码给了我想要的结果。

现在我被困在尝试过滤具有相同时间戳的所有条目 - 我想过滤在同一天采集的所有样本并找到平均值。在这种情况下,subsetfilter 似乎都失败了。 R很糟糕。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 2021-11-29
    • 2022-08-18
    • 2018-11-27
    • 2018-11-01
    • 2018-02-01
    • 2023-03-21
    相关资源
    最近更新 更多