【问题标题】:R Data.Table Join - Transform 'Missing' from NA to a Default ValueR Data.Table Join - 将“缺失”从 NA 转换为默认值
【发布时间】:2013-10-11 19:16:57
【问题描述】:

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

我创建了一个函数“default”,它将用默认值替换 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

感谢您的帮助。

【问题讨论】:

  • 看看left[right],这应该会让你明白为什么你的方法不起作用
  • 我会做right[left][is.na(value), value := "none"]

标签: r data.table


【解决方案1】:

你可以这样做:

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 函数仅应用于rightvalue 列,即default(c("a","b"),"none")。然后,value 列将更新为在连接之前具有 value 的行的函数结果。另一个leftrows,在right 中没有任何对应的行,而是得到一个NA

对不起,我的解释不清楚……

【讨论】:

  • 如果我采用这种方法,那么我正在制作数据的副本,对吗?
  • @NickAllen 是的,如果你的意思是在内存中你将同时拥有leftrightright[left,...] 数据表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 2019-05-05
相关资源
最近更新 更多