最近我遇到了一个让我头痛不已的 data.table
问题。看起来像是一个bug,但也许我错过了什么显而易见的东西。
我有以下数据框:
# First some data
data <- data.table(structure(list(
month = structure(c(1356998400, 1356998400, 1356998400,
1359676800, 1354320000, 1359676800, 1359676800, 1356998400, 1356998400,
1354320000, 1354320000, 1354320000, 1359676800, 1359676800, 1359676800,
1356998400, 1359676800, 1359676800, 1356998400, 1359676800, 1359676800,
1359676800, 1359676800, 1354320000, 1354320000), class = c("POSIXct",
"POSIXt"), tzone = "UTC"),
portal = c(TRUE, TRUE, FALSE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE
),
satisfaction = c(10L, 10L, 10L, 9L, 10L, 10L, 9L, 10L, 10L,
9L, 2L, 8L, 10L, 9L, 10L, 10L, 9L, 10L, 10L, 10L, 9L, 10L, 9L,
10L, 10L)),
.Names = c("month", "portal", "satisfaction"),
row.names = c(NA, -25L), class = "data.frame"))
我想通过portal
和month
来进行总结。使用经典的tapply
进行总结,结果如预期-我得到了一个3x2的矩阵,其中包含了2012年12月和2013年1-2月的结果:
> tapply(data$satisfaction, list(data$month, data$portal), mean)
FALSE TRUE
2012-12-01 8.5 8.000000
2013-01-01 10.0 10.000000
2013-02-01 9.0 9.545455
data.table
的 by
参数不支持总结功能:
> data[, mean(satisfaction), by = 'month,portal']
month portal V1
1: 2013-01-01 FALSE 10.000000
2: 2013-02-01 TRUE 9.000000
3: 2013-01-01 TRUE 10.000000
4: 2012-12-01 FALSE 8.500000
5: 2012-12-01 TRUE 7.333333
6: 2013-02-01 TRUE 9.666667
7: 2013-02-01 FALSE 9.000000
8: 2012-12-01 TRUE 10.000000
正如您所看到的,它返回了一个数据表,其中有8个值,而不是预期的6个值;例如,portal == TRUE
和month == 2012-02-01
的值是重复的。
有趣的是,如果我仅限于2013年的数据,一切都按预期工作:
> data[month >= ymd(20130101), mean(satisfaction), by = 'month,portal']
month portal V1
1: 2013-01-01 TRUE 10.000000
2: 2013-01-01 FALSE 10.000000
3: 2013-02-01 TRUE 9.545455
4: 2013-02-01 FALSE 9.000000
我感到非常困惑 :). 请有人帮助我吗?
by=list(month, portal)
。 - Andriedata[, mean(satisfaction), by = list(month, portal)]
产生了相同(不正确)的结果。其次,根据data.table
的帮助文档,两种语法都被支持:“by - 单个未引用的列名、列名表达式的列表、包含逗号分隔列名的单个字符字符串或列名的字符向量。” - Victor K.as.Date
)似乎可以解决问题。我认为 data.table 在某些日期是否“相等”方面进行了一些纠结(正确?错误?)。 - jorantable(c(1356998400, 1356998400, 1356998400, 1359676800, 1354320000, 1359676800, 1359676800, 1356998400, 1356998400, 1354320000, 1354320000, 1354320000, 1359676800, 1359676800, 1359676800, 1356998400, 1359676800, 1359676800, 1356998400, 1359676800, 1359676800, 1359676800, 1359676800, 1354320000, 1354320000))
时,我得到了完全不同的三个值。 - Victor K.