我有两个数据帧,它们都包含相同的变量和每个观察的唯一 ID。
df.1 是一个大型数据集,其中包含由 NA 表示的缺失值。这些缺失条目的值包含在 df.2 中,我想通过匹配 id 将 df.1 中的缺失值替换为 df.2 中的值。
我在这里找不到类似的问题,考虑到它们都是因子变量。
为了让事情变得更简单:如果 id 匹配 - df.1 中的缺失值应替换为 df.2 中的因子值。
df.1 <- data.frame(id = c(334,440,501,2304,2500),
v1 = c("4 dogs",NA,"3 dogs",NA,"No dogs"))
df.2 <- data.frame(id = c(440,2304),
v2 = c("4 dogs","5 dogs"))
非常感谢您的帮助。
最佳答案
正如 @Gregor 提到的,您可以将 df 转换回因子。这里方便的函数是@MrFlick 的coalesce
函数。解决方案是不言自明的
library(dplyr)
df.1 %>%
left_join(df.2, by = "id") %>%
mutate_if(is.factor, as.character) %>%
mutate(final = coalesce(v1, v2)) %>% mutate_if(is.character, as.factor)
输出
id v1 v2 final
1 334 4 dogs <NA> 4 dogs
2 440 <NA> 4 dogs 4 dogs
3 501 3 dogs <NA> 3 dogs
4 2304 <NA> 5 dogs 5 dogs
5 2500 No dogs <NA> No dogs
将上述结果存储在变量(df)中,然后检查str(df)
'data.frame': 5 obs. of 4 variables:
$ id : num 334 440 501 2304 2500
$ v1 : Factor w/ 3 levels "3 dogs","4 dogs",..: 2 NA 1 NA 3
$ v2 : Factor w/ 2 levels "4 dogs","5 dogs": NA 1 NA 2 NA
$ final: Factor w/ 4 levels "3 dogs","4 dogs",..: 2 2 1 3 4
如果您想删除 v1
和 v2
列,只需将最终结果通过管道传输到 %>% select(id,final)
希望它能起作用。
关于r - 使用 id 匹配和替换因子值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48082787/