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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:24:03