用其他数据帧中的值替换数据帧中的na。

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

这是我的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
  )

我需要将x中的NA值替换为y中的df值,这是我所期望的。

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
  )

有人知道怎么做吗?谢谢!这是我的df的例子。

r replace na
1个回答
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
投票

基础R使用匹配。

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

0
投票

As 月份y 是一连串的 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
© www.soinside.com 2019 - 2024. All rights reserved.