用其他df r中的值替换数据框中的na

时间:2020-06-16 03:09:43

标签: r replace na

这是我的df的示例:

x<-tibble::tribble(
  ~ID, ~Month, ~Value,
  "A",     1L,   100L,
  "A",     2L,   200L,
  "A",     3L,     NA,
  "A",     4L,   400L,
  "B",     1L,    50L,
  "B",     2L,    20L,
  "B",     3L,    30L,
  "B",     4L,     NA,
  "C",     1L,     NA,
  "C",     2L,    60L,
  "C",     3L,    70L,
  "C",     4L,    60L,
  "D",     1L,    60L,
  "D",     2L,    60L,
  "D",     3L,    60L,
  "D",     4L,    50L
  )

我还有另一个具有以下值的df:

y<-tibble::tribble(
  ~Month, ~Value,
      1L,    50L,
      2L,   100L,
      3L,    20L,
      4L,    70L
  )

我需要用y df的值替换x中的NA。 这就是我的期望。

xy<- tibble::tribble(
  ~ID, ~Month, ~Value,
  "A",     1L,   100L,
  "A",     2L,   200L,
  "A",     3L,    20L,
  "A",     4L,   400L,
  "B",     1L,    50L,
  "B",     2L,    20L,
  "B",     3L,    30L,
  "B",     4L,    70L,
  "C",     1L,    50L,
  "C",     2L,    60L,
  "C",     3L,    70L,
  "C",     4L,    60L,
  "D",     1L,    60L,
  "D",     2L,    60L,
  "D",     3L,    60L,
  "D",     4L,    50L
  )

有人知道怎么做吗?谢谢!

3 个答案:

答案 0 :(得分:3)

您可以合并数据并使用coalesce选择非NA值。

library(dplyr)

x %>%
  left_join(y, by = 'Month') %>%
  mutate(Value = coalesce(Value.x, Value.y)) %>%
  select(names(x))

在基数R中,您可以merge并使用ifelse选择非NA值

transform(merge(x, y, by = 'Month'), 
          Value = ifelse(is.na(Value.x), Value.y, Value.x))[names(x)]

答案 1 :(得分:1)

使用匹配的Base R:

x$Value[which(is.na(x$Value))] <- y$Value[match(x$Month[which(is.na(x$Value))],
                                                y$Month)]

答案 2 :(得分:0)

由于y中的 Month 1:4的序列,您可以直接使用Month进行子设置。

i <- is.na(x$Value)
#i <- which(is.na(x$Value)) #Alternative

x$Value[i] <-  y$Value[x$Month[i]]
#x$Value[i] <-  y$Value[match(x$Month[i], y$Month)] #Alternative in case Month is not a sequence

x
#   ID Month Value
#1   A     1   100
#2   A     2   200
#3   A     3    20
#4   A     4   400
#5   B     1    50
#6   B     2    20
#7   B     3    30
#8   B     4    70
#9   C     1    50
#10  C     2    60
#11  C     3    70
#12  C     4    60
#13  D     1    60
#14  D     2    60
#15  D     3    60
#16  D     4    50