gpt4 book ai didi

r - 合并后,将生成的 NA 值替换为 0,保留预先存在的 NA

转载 作者:行者123 更新时间:2023-12-02 09:12:08 28 4
gpt4 key购买 nike

合并两个数据帧时,如何将合并产生的 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.frame 以及 data.table

最佳答案

也许有更简单的方法,但以下方法可以做到。

注意:
为了应对引用中OP评论中所述的可能性,对原始代码进行了彻底修改。

This is good, but only works if the indexes match. Consider the case when instead of C missing, B is missing from df2. Then the rows in df3 coming from df2 have indexes 1 and 3, while in df2 they have indexes 1 and 2

新代码解决了这两种情况,因此我将其放在一个函数中。

library(data.table)

fun <- function(DF1, DF2){
res <- merge(DF1, DF2, all.x = T, by = 'TYPE')
inx <- which(!(DF1$TYPE %in% DF2$TYPE))
res[inx, which(is.na(res[inx, ]))] <- 0
res
}

fun(df1, df2)
# TYPE Num Dollar
#1: A NA 215.77
#2: B 11 NA
#3: C 0 0.00

fun(df1, df3)
# TYPE Num Dollar
#1: A NA 215.77
#2: B 0 0.00
#3: C 11 NA

测试数据。

df1df2是问题中的data.frames,df3是OP评论中的df。

df1 <- fread("
TYPE
A
B
C
")

df2 <- fread("
TYPE Num Dollar
A NA 215.77
B 11 NA
")

df3 <- fread("
TYPE Num Dollar
A NA 215.77
C 11 NA
")

关于r - 合并后,将生成的 NA 值替换为 0,保留预先存在的 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50931655/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com