R语言如何成对匹配合并多列值 可使用mutate或coalesce实现
调研分支题项合并简洁实现方案需求
数据集基础信息
现有一份大型调研数据集,共包含约2000名参与者(数据行)、160个变量(数据列),涉及本次需求的核心字段如下:
participant IDS:参与者唯一标识IDcl.exp:二分类应答字段,取值仅为"yes"或"no"cl.yes.Q1至cl.yes.Q7:当参与者对cl.exp回答yes时存储有效应答,回答no时该组字段值均为NAcl.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,其余题项按规则类推
当前实现与问题
目前通过如下代码完成处理:
- 交换第15、16列,修正Q6、Q7的顺序反转问题
df[15:16] <- df[16:15]
- 拆分筛选两组应答数据,统一列名后全量合并得到结果
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
相关产品推荐
相关产品推荐

