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

R语言合并列:同数据分栏存储且每行对应不同条件的处理方案

R语言合并调研重复列并新增条件列解决方案

针对你提到的26个随机顺序调研问题的数据处理需求——合并存储相同数据的多列为单一有效值列,同时新增列记录每行对应的来源条件(而非仅移除NA或叠加信息),以下是完整的R语言解决方案,弥补你之前用coalesce仅合并值的局限:

核心思路

通过宽表转长表筛选或逐行定位非NA值两种方式,既合并出有效值列,又记录该值对应的原始列(即你需要的“条件”)。


方案一:用tidyr+dplyr的宽转长实现(推荐,适配多列场景)

这种方法适合处理大量列(比如26个调研问题列),代码扩展性强:

library(dplyr)
library(tidyr)

# 模拟你的调研数据结构(id为唯一标识,q1~q26为随机填写的同类型问题列)
set.seed(123)
df <- data.frame(
  id = 1:5,
  q1 = sample(c("同意", "不同意", NA), 5, replace = TRUE),
  q2 = sample(c("同意", "不同意", NA), 5, replace = TRUE),
  q3 = sample(c("同意", "不同意", NA), 5, replace = TRUE)
  # 实际场景中可扩展到q1~q26
)
# 模拟调研数据特征:每行仅一个问题列有有效值(其余为NA)
df <- df %>%
  rowwise() %>%
  mutate(across(q1:q3, ~ifelse(row_number() != which(!is.na(c_across(q1:q3)))[1], NA, .x))) %>%
  ungroup()

# 执行合并与条件记录
df_processed <- df %>%
  # 将所有调研问题列转成长表,记录列名(条件)和对应值
  pivot_longer(
    cols = starts_with("q"),  # 替换为你的实际列前缀/范围,比如cols = q1:q26
    names_to = "来源条件",
    values_to = "合并后值"
  ) %>%
  # 过滤掉NA行,保留每行的有效值
  filter(!is.na(`合并后值`)) %>%
  # 整理成目标格式
  select(id, `合并后值`, `来源条件`)

print(df_processed)

方案二:逐行定位非NA值(适合需要保留原表结构的场景)

如果需要在原数据基础上直接新增列,可使用逐行处理的方式:

library(dplyr)

# 基于上述模拟数据,直接新增合并列与条件列
df_processed2 <- df %>%
  rowwise() %>%
  mutate(
    # 合并多列取第一个非NA值(和你之前的coalesce逻辑一致)
    `合并后值` = coalesce(!!!syms(paste0("q", 1:3))),  # 扩展为q1~q26
    # 定位非NA值所在的列名,作为条件记录
    `来源条件` = names(select(cur_data(), starts_with("q")))[which(!is.na(c_across(starts_with("q"))))]
  ) %>%
  ungroup() %>%
  # 保留需要的列
  select(id, `合并后值`, `来源条件`)

print(df_processed2)

适配你的实际数据

将代码中的starts_with("q")或q1:q3替换为你实际的调研问题列范围即可,比如如果你的列名是question_1到question_26,就改成cols = starts_with("question")或cols = question_1:question_26。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:42:48