2017-04-23 140 views
0

我有一个大型数据集(> 3k行),我想根据地理位置和日期进行过滤。位置过滤工作正常,但使用逻辑运算符在日期上与filter时,我得到了以下错误消息(dplyr):在R中使用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) 

我该如何得到这个工作?

+0

我觉得你的'State.Name == site.info $ State.Name'可能会令人困扰,如果'site.info'中有更多的元素并且是'factor'类。你可以尝试一个'加入'。这可以通过'data.table'更容易完成,也就是'setDT(master.data)[site.info,on =。(State.Name,Date.Local> = Date.Start,Date.Local <= Date.End )]' – akrun

+0

我也会试试这个。 'site.info'不超过12行,日期格式使用'as.Date',所以我很好奇它为什么不起作用。 – Gautam

+1

您的State.Name列可能是一个因素 - 在每个data.frame中具有不同的级别。如果在你的问题中包含'dput(head(master.data))',我们可以肯定地知道。除非你想把这个专栏作为一个因素,否则不要让它成为一个专栏。 EG在'read.table'中使用'stringsAsFactors = FALSE' –

回答

0

大量尝试后,似乎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是祸患。