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

R语言如何成对匹配合并多列值 可使用mutate或coalesce实现

调研分支题项合并简洁实现方案需求

数据集基础信息

现有一份大型调研数据集,共包含约2000名参与者(数据行)、160个变量(数据列),涉及本次需求的核心字段如下:

  • participant IDS:参与者唯一标识ID
  • cl.exp:二分类应答字段,取值仅为"yes"或"no"
  • cl.yes.Q1至cl.yes.Q7:当参与者对cl.exp回答yes时存储有效应答,回答no时该组字段值均为NA
  • cl.no.Q1至cl.no.Q7:当参与者对cl.exp回答no时存储有效应答,回答yes时该组字段值均为NA

字段对应规则说明:

两组分支题项的测量含义基本一致,仅Q6、Q7的对应关系存在反转:cl.no.Q7与cl.yes.Q6测量含义一致,cl.no.Q6与cl.yes.Q7测量含义一致。
经前置校验,每名参与者仅在cl.yes.Q1-Q7、cl.no.Q1-Q7其中一组字段存在有效值,两组字段不会同时出现非NA值。

目标需求

需要实现以下任意一种处理结果:

  • 方案a:将cl.no.Q1-Q7的有效值按对应规则填充到cl.yes.Q1-Q7列
  • 方案b:新建统一前缀的合并列,例如将cl.yes.Q1与cl.no.Q1的有效值合并为cl.Q1,其余题项按规则类推

当前实现与问题

目前通过如下代码完成处理:

  1. 交换第15、16列,修正Q6、Q7的顺序反转问题
df[15:16] <- df[16:15]
  1. 拆分筛选两组应答数据,统一列名后全量合并得到结果
df.yes <- df %>% 
             select(contains("cl.yes"), id, cl.exp)  %>%
             drop_na()

df.no <- df %>% 
             select(contains("cl.no"), id, cl.exp)  %>%
             drop_na()

names(df.yes) <- gsub("cl.yes.", "cl.", names(df.yes))
names(df.no) <- gsub("cl.no.", "cl.", names(df.no))
df.cl <- merge(df.yes, df.no, all = TRUE)

上述代码可以得到正确的合并结果,但写法冗余不够简洁,希望得到仅用1-2行代码即可实现、支持直接在原数据框上操作的优雅方案,此前尝试mutate搭配coalesce的多种写法均未成功。

内容的提问来源于stack exchange,提问作者kashdollaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:39:17