【发布时间】:2014-03-18 15:10:19
【问题描述】:
我有一个带有两列键(id、日期)和一列或多列数据的 data.table。某些数据可能缺少值,因此我使用 zoo 的 na.locf() 来填充它。我注意到此操作更改了我的 data.table 中的键,我需要为后续连接重新键入它。为什么会发生这种情况,在哪些其他情况下我可以期待这种行为?
您可以使用下面的代码重现该问题。
谢谢!
require(zoo)
d <- data.table(id = rep(1:2, each = 5), date = rep(1:5, 2), value = c(1,2,NA,NA,NA, 6,7,8,9,10))
setkey(d, id, date)
x <- d[, lapply(.SD, na.locf, na.rm = FALSE, maxgap = 1), by = 'id']
key(d)
key(x)
【问题讨论】:
-
那么,data.table 怎么知道新的
date列仍然是排序的呢?我发现更令人惊讶的是d[, names(d)[-1] := lapply(.SD, na.locf, na.rm = FALSE, maxgap = 1), by = 'id']完全删除了密钥。 -
我认为默认行为是通过键中的列重新设置密钥,只是想确保它不是发生了其他事情。
-
不,列是键意味着data.table是按它排序的。如果您创建一个新列(无论是您的方式还是通过引用),这意味着它不确定 data.table 是否按它排序。您必须明确地重新键入是一项功能,因为排序会降低性能,并且有时您不希望 data.table 使用新列作为键,即使它的名称与旧列的名称相同。
标签: r data.table