如何合并名称末三位相同的数值列?寻求tidyverse解决方案
解决方案
针对你这种每组末三位相同的列仅含一个有效值的场景,用tidyverse的长格式转宽格式组合操作最直接,代码逻辑清晰且易维护:
library(tidyverse) # 假设原始数据集名为data data.test <- data %>% # 把所有列转成长格式,列名存到col_name,对应值存到value pivot_longer(everything(), names_to = "col_name", values_to = "value") %>% # 提取列名最后三位,拼接成目标列名(比如Qa101→Q101) mutate(new_col = str_c("Q", str_sub(col_name, start = -3))) %>% # 过滤掉NA值,每组仅保留有有效值的那一行 filter(!is.na(value)) %>% # 转回宽格式,得到合并后的列 pivot_wider(names_from = new_col, values_from = value)
代码说明
pivot_longer(everything()):把宽格式数据转成长格式,方便按列名末三位分组处理str_sub(col_name, start = -3):精准提取列名最后三个字符,再用str_c拼接成你要的新列名filter(!is.na(value)):利用每组仅一个有效值的特点,直接滤除NA行,留下每组的有效数据pivot_wider:把处理后的长格式数据转回宽格式,得到最终合并结果
替代方案(无需转长格式)
如果偏好直接在宽格式下操作,也可以用分组汇总的方式:
data.test <- data %>% summarise( across(everything(), .names = "{str_c('Q', str_sub(.col, start = -3))}", ~ .x[!is.na(.x)] ) )
内容的提问来源于stack exchange,提问作者sm1231
相关产品推荐
相关产品推荐

