在R中比较两个日期

14

我有一个用制表符分隔的文本文件,我将其导入到了R中。我使用了以下命令进行导入:

data = read.table(soubor, header = TRUE, sep = "\t", dec = ".", colClasses =c("numeric","numeric","character","Date","numeric","numeric"))

当我运行str(data)来检查我的列的数据类型时,我得到:
'data.frame':   211931 obs. of  6 variables:
$ DataValue   : num  0 0 0 0 0 0 0 0 0 NA ...
$ SiteID      : num  1 1 1 1 1 1 1 1 1 1 ...
$ VariableCode: chr  "Sucho" "Sucho" "Sucho" "Sucho" ...
$ DateTimeUTC : Date, format: "2012-07-01" "2012-07-02" "2012-07-03" "2012-07-04" ...
$ Latitude    : num  50.8 50.8 50.8 50.8 50.8 ...
$ Longitude   : num  15.6 15.6 15.6 15.6 15.6 ...

这是我的数据的前20行可重现样本:

my_sample <- data.frame(
  DataValue = rep(c(0, NA, 0), c(9L, 8L, 3L)),
  SiteID = rep(1, 20L),
  VariableCode = rep("Sucho", 20L),
  DateTimeUTC = as.Date(c(
    "2012-07-01", "2012-07-02", "2012-07-03", "2012-07-04", "2012-07-05",
    "2012-07-06", "2012-07-07", "2012-07-08", "2012-07-09", "2012-07-10",
    "2012-07-11", "2012-07-12", "2012-07-13", "2012-07-14", "2012-07-15",
    "2012-07-16", "2012-07-17", "2012-07-18", "2012-07-19", "2012-07-20"
  )),
  Latitude = rep(50.77, 20L),
  Longitude = rep(15.55, 20L)
)

现在我想按日期筛选我的表格。请注意,我正在一个for循环内运行代码。首先,我通过2012年7月1日对我的数据进行子集处理并进行一些处理。然后,我通过7月2日对我的数据进行子集处理,并进行一些处理,以此类推。例如,我想获取日期等于2012年7月6日的所有行。我尝试了以下代码:

startDate = as.Date("2012-07-01");
endDate = as.Date("2012-07-20");
all_dates = seq(startDate, endDate, 1);

#the following code I'm trying to run inside a loop...
for (j in 1:length(all_dates)) {
    filterdate = all_dates[j];
    my_subset = my_sample[my_sample$DateTimeUTC == filterdate,]
    #now I want do do some processing on my_subset...
}

但是上面的代码从循环的第7步开始返回一个空数据集。

例如:

subset_one = my_sample[my_sample$DateTimeUTC == all_dates[6],]

返回:6个变量的3个观测值

但是,由于某种未知原因,示例:

subset_two = my_sample[my_sample$DateTimeUTC == all_dates[7],]

返回:

0个变量的6个obs

(注意:我编辑了上面的代码,使我的问题100%可重现)

有什么想法我做错了什么吗?


1
请阅读R语言入门教程以了解基本子集操作。data[data$DateTimeUTC == as.Date("2012-07-04"),] - Roland
@Roland:你的示例代码可以正常工作并返回所需结果,但是出于某种原因,当我以编程方式设置筛选日期(例如在for循环内部)时,我得到了一个空数据集。我编辑了我的示例代码以澄清我的问题。 - jirikadlec2
我进一步编辑了示例以使其可重现。这很奇怪。没有 for 循环,子集是正确的。在 for 循环内部,子集总是为空的。 - jirikadlec2
1
一个例子如果没有一些展示问题的数据是无法复现的。使用dput(head(data))来提供一个小的数据样本,我们可以将其粘贴到R会话中。 - Roland
1
查找“分割应用组合”以了解如何摆脱for循环。 - Richie Cotton
显示剩余2条评论
1个回答

9
以下解决方案解决了我的问题: 不再使用Date数据类型,而是尝试使用POSIXct数据类型。 以下是读取制表符分隔文本文件的示例代码,之后子集化在所有for循环步骤中都有效:
data = read.table("data.txt", header = TRUE, sep = "\t", dec = ".", 
    colClasses =c("numeric","numeric","character","POSIXct","numeric","numeric"));
startDate = as.POSIXct("2012-07-01");
endDate = as.POSIXct("2012-07-20");
all_dates = seq(startDate, endDate, 86400); #86400 is num of seconds in a day

#the following code I'm trying to run inside a loop...
for (j in 1:length(all_dates)) {
    filterdate = all_dates[j];
    my_subset = data[data$DateTimeUTC == filterdate,]
    #now I want do do some processing on my_subset...
}

2
我采用了相似的方法。我用 subset 命令替换了循环,所以我使用了 subset(data, data$DateTimeUTC %in% all_dates)。在我的情况下,我需要使用 as.Date 函数包装数据 - subset(data, as.Date(data$DateTimeUTC) %in% as.Date(all_dates))。 - 32cupo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接