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

R语言:合并数据框中基于Check条件的重复Likert问题列

解决方案:合并基于二元选择的重复Likert问题列

以下提供两种高效的R语言实现方案,适配不同数量的重复列场景:

先模拟你的数据

首先还原你的数据集(注意:如果原始数据中空值是空字符串,先执行df[df == ""] <- NA转换为R标准缺失值):

df <- data.frame(
  Check = c(1,1,2,2),
  Q1 = c(5,2,NA,NA),
  Q2 = c(5,5,NA,NA),
  Q3 = c(4,3,NA,NA),
  Q1.1 = c(NA,NA,4,4),
  Q2.1 = c(NA,NA,6,2),
  Q3.1 = c(NA,NA,3,1)
)

方法1:dplyr批量处理(适合列数较少或明确对应关系的场景)

利用across函数批量遍历所有目标列,根据Check值匹配对应列:

library(dplyr)

df_merged <- df %>%
  # 批量处理每一组Q列:Check=1取原列,Check=2取后缀.1的列
  mutate(
    across(starts_with("Q") & !ends_with(".1"), 
           ~case_when(
             Check == 1 ~ .,
             Check == 2 ~ get(paste0(cur_column(), ".1")),
             TRUE ~ NA_real_
           )),
    .keep = "unused"  # 自动移除所有.1结尾的重复列
  )

方法2:tidyr重塑法(适合大量重复列的通用场景)

通过数据重塑自动匹配问题组,无需手动指定每一列:

library(tidyr)
library(dplyr)

df_merged <- df %>%
  # 将宽表转长表,拆分问题名和分组后缀
  pivot_longer(
    cols = -Check,
    names_to = c("question", "group"),
    names_pattern = "(Q\\d+)\\.?(.*)",  # 正则捕获Q编号和分组
    values_drop_na = TRUE
  ) %>%
  # 过滤出Check与分组匹配的行
  filter((Check == 1 & group == "") | (Check == 2 & group == "1")) %>%
  # 转回宽表格式
  pivot_wider(
    id_cols = Check,
    names_from = question,
    values_from = value
  )

两种方法最终输出的结果均符合你的需求:

CheckQ1Q2Q3
1554
1253
2463
2421

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:15:38