R Data.Table Join - 将'缺失'从NA转换为默认值

时间:2013-10-11 19:16:57

标签: r data.table

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

我创建了一个函数'default',它将用默认值替换NAs。

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

感谢您的帮助。

1 个答案:

答案 0 :(得分: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功能仅应用于value的{​​{1}}列,即right 。然后使用函数的结果更新default(c("a","b"),"none")列,以便在加入之前具有value的行。 value中没有任何相应行的其他left行会改为right

抱歉,不确定我的解释是否非常明确......