You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:54:30