我正在尝试加入两个数据表。第一个(下面称为“左”)有一组键(列'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
感谢您的帮助。
答案 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
。
抱歉,不确定我的解释是否非常明确......