【发布时间】:2020-03-03 16:27:16
【问题描述】:
我有几百万行的 data.table 并尝试在日期字段上进行聚合。返回的结果是数字(而不是日期),我不知道为什么。我一直在尝试重现该示例,但无济于事。 这是我的代码示例:
DT <- data.table(ID = c(1,1,2,1,2,3,2,3,1), col1 = c('Y', 'N', 'Y', 'Y', 'N', 'Y',' Y', 'N', 'N'), col2 = as.Date(c('2001-01-01', '2002-01-01', '2003-01-01', '2004-01-01','2005-01-01', NA, '2007-01-01', '2008-01-01', NA), '%Y-%m-%d'))
> DT
ID col1 col2
1: 1 Y 2001-01-01
2: 1 N 2002-01-01
3: 2 Y 2003-01-01
4: 1 Y 2004-01-01
5: 2 N 2005-01-01
6: 3 Y <NA>
7: 2 Y 2007-01-01
8: 3 N 2008-01-01
9: 1 N <NA>
DT_agg = DT[, .(max_date = if(!any(col1 == "Y")) NA_real_ else max(col2[which(col1 == "Y")], na.rm = TRUE) ) , by = .(ID)]
Warning message:
In max.default(NA_real_, na.rm = TRUE) :
no non-missing arguments to max; returning -Inf
# this works on the sample data.table.
# and it's desired output. But it doesn't work on my
# real data.table. max_date has numeric values instead (e.g. 11124, 22354, etc.)
> DT_agg
ID max_date
1: 1 2004-01-01
2: 2 2003-01-01
3: 3 <NA>
# this is what i want for my results. but in my real table max_date becomes numeric and unusable
> class(DT_agg$max_date)
[1] "Date"
在上面的示例代码中DT_agg$max_date 是一个日期类。但由于某种原因,在我的表中它是数字的。我在另一个日期字段上运行相同的聚合,这很好。
【问题讨论】:
-
您的意思是这适用于您提供的样本数据,但不适用于您的真实数据?
-
是的。这是正确的。我将编辑我的问题以使其更清楚。这适用于提供的示例,但不适用于我的大型真实 data.table
-
我认为
col2[which(col1 == "Y")]在某些情况下是length(0)在删除导致该警告的 NA 之后。您可以使用此数据集进行复制:DT <- data.table(ID = c(1,1,2,1,2,3,2,3,1), col1 = rep("Y", 9L), col2 = as.Date(rep(NA, 9L), '%Y-%m-%d')) -
!any(col1 == "Y")可以简化为all(col1 != "Y")。 -
关于您的问题。用
as.Date(NA_real_, origin = "2000-01-01")之类的东西替换NA_real_会起作用吗?
标签: r date data.table aggregate