这是我的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
)
有人知道怎么做吗?谢谢!
答案 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