在R中合并含0、1、NA的q2、q3列组并保留q-1到q-5独立列的方法
R实现同序号列合并取非NA值的方案
你需要的核心逻辑是对每组相同序号的q2、q3列,取每行中唯一的非NA有效值,用dplyr的coalesce()函数可以直接实现该需求,以下是两种常用方案:
方案1:手动指定列(列数较少时首选,逻辑最直观)
仅需几行代码即可完成生成,不需要额外转换数据结构:
# 先加载依赖包 library(dplyr) result <- df %>% mutate( `q-1` = coalesce(`q2-1`, `q3-1`), `q-2` = coalesce(`q2-2`, `q3-2`), `q-3` = coalesce(`q2-3`, `q3-3`), `q-4` = coalesce(`q2-4`, `q3-4`), `q-5` = coalesce(`q2-5`, `q3-5`), # 可选:添加该参数后仅保留新生成的q-*列,自动删除原q2、q3列 .keep = "none" )
coalesce()函数的特性是按传入顺序取第一个非NA值,刚好适配你数据中每行同序号列只有一个有效值的场景。
方案2:批量自动处理(列数较多时使用,无需手动写每一列)
如果后续序号不止5个,用长表转宽表的方案可以批量处理任意数量的列:
library(dplyr) library(tidyr) result <- df %>% # 先给每行加唯一标识,方便后续转换回宽表时对应行顺序 mutate(rowid = row_number()) %>% # 把所有q2、q3列转为长格式,自动过滤NA值 pivot_longer(cols = -rowid, names_to = c("group", "num"), names_sep = "-", values_drop_na = TRUE) %>% # 按行和序号分组取有效值 group_by(rowid, num) %>% summarise(value = first(value), .groups = "drop") %>% # 转回宽格式生成q-*列 pivot_wider(names_from = num, values_from = value, names_prefix = "q-") %>% # 删除辅助的行号列 select(-rowid)
两种方案输出的结果完全一致,你可以根据自己的列数量选择对应的方法。
内容的提问来源于stack exchange,提问作者r_noobie
相关产品推荐
相关产品推荐

