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
相关产品推荐
相关产品推荐

