这是我的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的例子。
你可以加入数据,并使用 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)]
基础R使用匹配。
x$Value[which(is.na(x$Value))] <- y$Value[match(x$Month[which(is.na(x$Value))],
y$Month)]
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