为什么data.table在j中进行转换后会更改密钥?

时间:2014-03-18 15:10:20

标签: r data.table

我有一个带有两列密钥(id,date)和一列或多列数据的data.table。一些数据可能缺少值,所以我使用动物园中的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)

1 个答案:

答案 0 :(得分:2)

我认为这可以满足您的需求:

x <- copy(d)
x[, (3:length(x)) := lapply(.SD, na.locf, maxgap = 1), by = 'id', .SDcols=3:length(x)]
key(x)

结果:

[1] "id"   "date"

x

    id date value
 1:  1    1     1
 2:  1    2     2
 3:  1    3     1
 4:  1    4     2
 5:  1    5     1
 6:  2    1     6
 7:  2    2     7
 8:  2    3     8
 9:  2    4     9
10:  2    5    10

这假设您不需要在na.locf列上应用date。由于您未使用其他列上的:=更改该列,因此会保留表格中的密钥。

另外,我必须将na.locf na.rm的使用更改为默认值,否则不会执行任何操作。