2

我正在尝试加入两个数据表。第一个(下面称为“左”)有一组键(“k”列)。第二个('right')具有一组相似的键以及每个键的值。我想就地更新“左”数据,使其具有来自“右”的值。但是在它不存在的情况下,应该填充一个默认值而不是 NA。

我创建了一个函数“默认”,它将用默认值替换 NA。

default <- function(value, default) {
    value[is.na(value)] <- default
    return(value)
}

我不明白为什么以下不起作用。

left <- data.table(k=c(1,2,3,4,NA), key="k")
right <- data.table(k=c(1,2), value=c("a","b"), key="k")
left[right, value := default(value,"none")]

实际结果...

> left
    k value
1: NA    NA
2:  1     a
3:  2     b
4:  3    NA
5:  4    NA

预期结果...

    k value
1: NA    none
2:  1     a
3:  2     b
4:  3    none
5:  4    none

谢谢你的帮助。

4

1 回答 1

4

你可以这样做:

right[left, list(value=default(value,"none"))]

这使 :

    k value
1: NA  none
2:  1     a
3:  2     b
4:  3  none
5:  4  none

您的解决方案不起作用,因为当您这样做时value := default(value,"none"),该default功能仅适用于 的valueright,即default(c("a","b"),"none")value然后使用连接前具有 a 的行的函数结果更新该列valueleft中没有任何对应行的其他行right得到 a NA

抱歉,不确定我的解释是否很清楚...

于 2013-10-11T19:22:33.850 回答