我有一个带有两列密钥(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)
答案 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
的使用更改为默认值,否则不会执行任何操作。