用 id 替换另一个数据帧中的 NA 值

问题描述 投票:0回答:4

我有一个数据框 df1 如下 -

ID Count 
11  345
22  456
33  786
44  765
55  NA
66  888
77  NA

然后我有一个 df2 如下 -

 ID  Count 
 11  536
 22  654
 33  786
 44  999
 55  890
 66  111
 77  654

我希望将

NA
中的
df1
值替换为那些特定 id 的
df2
中的值。

结果

df3
应该是:

ID  Count 
11  345
22  456
33  786
44  765
55  890
66  888
77  654

任何帮助都会很棒 谢谢

r dataframe
4个回答
5
投票

使用

dplyr::coalesce
将使任务变得更简单。

library(dplyr)

df1 %>% inner_join(df2, by= "ID") %>%
  mutate(Count = coalesce(Count.x, Count.y)) %>%
  select(ID, Count)

#   ID Count
# 1 11   345
# 2 22   456
# 3 33   786
# 4 44   765
# 5 55   890
# 6 66   888
# 7 77   654

数据:

df1 <- read.table(text = 
"ID Count 
11  345
22  456
33  786
44  765
55  NA
66  888
77  NA",
header = TRUE)

df2 <- read.table(text = 
"ID  Count 
11  536
22  654
33  786
44  999
55  890
66  111
77  654",
header = TRUE)

1
投票

您可以使用更新联接来编辑第一个表中的这些行:

library(data.table)
setDT(DF1); setDT(DF2)

DF1[is.na(Count), Count := DF2[.SD, on=.(ID), x.Count]]

如何运作

  • DF[i, j]
    i
    过滤,然后执行
    j
  • 所以在
    j
    中,
    .SD
    指的是用
    i
  • 过滤后的数据子集
  • A
    j
    :=
    添加或修改表中的列
  • x[i, on=, x.v]
    如这个类似答案中所述

0
投票

使用

dplyr

library(dplyr)

df1 %>%
  left_join(df2, by = c("ID")) %>%
  mutate(Count = ifelse(is.na(Count.x), Count.y, Count.x)) %>%
  select(-c(Count.x, Count.y))

这产生了

  ID Count
1 11   345
2 22   456
3 33   786
4 44   765
5 55   890
6 66   888
7 77   654

0
投票

要对多列执行此操作,并且如果 NA 发生在特定行的所有这些列中,您可以简单地过滤和连接数据帧:

missing_id <- df1 %>% filter(is.na(Count)) %>% pull(ID)  #Count = one of the columns with missing data

df1 <- df1 %>% filter(!is.na(Count)) %>%
      full_join(df2 %>% filter(ID %in% missing_id)) %>%
      arrange(ID)
© www.soinside.com 2019 - 2024. All rights reserved.