【发布时间】: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.info 和master.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 >= Date.Start, Date.Local <=Date.End)] -
我也试试这个。
site.info不超过 12 行,日期使用as.Date格式化,所以我很好奇它为什么不起作用。 -
您的 State.Name 列可能是一个因素 - 每个 data.frame 中的级别不同。如果您在问题中包含
dput(head(master.data)),我们可以确定。除非您希望将此列作为一个因素,否则不要让它成为一个因素。 EG 在read.table中使用stringsAsFactors = FALSE -
@Richard 你是对的,
State.Name确实是一个因素。输出太长,无法在此处打印。其他是int' ornum` 除了Date.Local是date -
两种方法都试过了,还是不行。还有其他建议吗?