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

R语言如何基于其他列分组拼接行值生成新列

R语言实现分组拼接字段的方案

你的需求本质是按QID字段分组,分别提取组内的题干文本、拼接组内所有选项文本,直接用分组汇总逻辑即可,不需要用到多列拼接的unite或者长宽转换的pivot_wider。

最简实现(推荐)

用dplyr的分组汇总函数直接处理,代码简洁可读性强:

library(dplyr)

# 源数据(替换成你自己的读入数据即可)
df <- data.frame(
  QID = c(1,1,1,2,2,2),
  Text = c("Please answer yes or no", "Yes", "No", "Please answer true or false", "True", "False"),
  Type = c("Question", "Choices", "Choices", "Question", "Choices", "Choices")
)

# 核心转换逻辑
result <- df %>%
  group_by(QID) %>%
  summarise(
    # 提取当前QID对应的题干文本,取第一个匹配值避免重复值异常
    Text = Text[Type == "Question"][1],
    # 提取当前QID下所有选项,用; 拼接成字符串
    Choices = paste(Text[Type == "Choices"], collapse = "; ")
  )

运行后得到的输出和你预期的结构完全一致:

# A tibble: 2 × 3
    QID Text                        Choices
  <dbl> <chr>                       <chr>  
1     1 Please answer yes or no     Yes; No
2     2 Please answer true or false True; False

之前方案不生效的原因

  • unite函数的作用是横向拼接同一行的多个列,你的需求是纵向拼接同组的多行值,场景不匹配
  • pivot_wider是长宽表转换函数,用来做这个需求需要额外构造辅助列、做列表列处理,逻辑绕且效率低,不推荐使用。如果一定要用该函数实现,参考写法如下:
library(tidyr)
library(purrr)

result_pivot <- df %>%
  # 给选项加序号避免值重复导致报错
  mutate(
    col_name = Type,
    seq = seq_along(Text), .by = c(QID, Type)
  ) %>%
  pivot_wider(id_cols = QID, names_from = col_name, values_from = Text, values_fn = list) %>%
  mutate(
    Text = map_chr(Question, ~.x[1]),
    Choices = map_chr(Choices, ~paste(.x, collapse = "; "))
  ) %>%
  select(QID, Text, Choices)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:06:51