如何在R中使用case_when语句将DataFrame b的fa列添加到DataFrame a?
问题分析与解决
你的代码问题出在循环每次都会重新生成a1,覆盖之前的结果,最终只保留了最后一次循环(i=3)的匹配逻辑——仅当name == "d"时赋值fa=3,其他行自然都是NA。
下面给出几种可行的解决方式,包括你要求的case_when用法,以及更适合这类场景的方法:
方法1:用case_when批量匹配(无需循环)
直接把b中的对应关系全部写入case_when的条件链:
library(dplyr) a <- data.frame(name = c("a","c","d")) b <- data.frame(device = c("a","c","d"), fa = c(1:3)) a1 <- a %>% mutate(fa = case_when( name == "a" ~ 1L, name == "c" ~ 2L, name == "d" ~ 3L, TRUE ~ NA_integer_ # 可选:处理未匹配到的name ))
如果b的行数较多,手动写条件太繁琐,可以用动态生成条件的方式:
a1 <- a %>% mutate(fa = case_when( !!!purrr::map2(b$device, b$fa, ~ expr(name == !!.x ~ !!.y)), TRUE ~ NA_integer_ ))
方法2:用case_match简化匹配(dplyr 1.1.0+支持)
case_match是专门用于值匹配的函数,比case_when更简洁:
a1 <- a %>% mutate(fa = case_match( name, !!!set_names(b$fa, b$device) ))
方法3:左连接(更高效的常规方案)
其实你的需求本质是根据公共列匹配合并数据,用left_join比case_when更高效,尤其适合大数据量:
a1 <- a %>% left_join(b, by = c("name" = "device"))
以上三种方法都能得到你期望的输出:
name fa 1 a 1 2 c 2 3 d 3
内容的提问来源于stack exchange,提问作者aVral
相关产品推荐
相关产品推荐

