【发布时间】:2018-06-19 15:08:19
【问题描述】:
合并两个数据框时,如何将合并产生的 NA 值设置为 0,同时将预先存在的 NA 值保留为 NA?
library(data.table)
df1 <- fread("
TYPE
A
B
C
")
df2 <- fread("
TYPE Num Dollar
A NA 215.77
B 11 NA
")
merge(df1, df2, all.x = T)
实际输出:
TYPE Num Dollar
1: A NA 215.77
2: B 11 NA
3: C NA NA
期望的输出:
TYPE Num Dollar
1: A NA 215.77
2: B 11 NA
3: C 0 0
编辑:这是一个更好的示例,说明为什么在更一般的情况下不能依赖索引
df1 <- fread("
TYPE
A
B
C
", data.table = F)
df2 <- fread("
TYPE Num Dollar
A NA 215.77
C 11 NA
", data.table = F)
merge(df1, df2, all.x = T)
# TYPE Num Dollar
# 1 A NA 215.77
# 2 B NA NA
# 3 C 11 NA
inx <- which(is.na(df2), arr.ind = TRUE)
df3 <- merge(df1, df2, all.x = T)
df3[is.na(df3)] <- 0
df3[inx] <- NA
df3
# TYPE Num Dollar
# 1 A NA 215.77
# 2 B 0 NA
# 3 C 11 0.00
编辑:Rui Barradas 和 akrun 的答案都有效。由于缺乏任何其他差异化因素,我接受了 Rui 的回答,因为它适用于 data.frames 和 data.tables
【问题讨论】:
-
只要
df3[is.na(df3)] <- 0。 -
@RuiBarradas 检查所需的输出。这不匹配。
-
我认为您可能必须将初始数据集中的
NA更改为-999之类的内容,然后在合并后进行更改,即for(j in 2:3) set(df2, i= which(is.na(df2[[j]])), j = j, -999) -
好的,抱歉,问题误解了。