R语言pivot_longer拆分多观测行报错,求解决方案
解决pivot_longer转换长格式的错误问题
错误原因
你遇到的Can't combine...错误,核心是**names_to的顺序和正则分组逻辑完全颠倒**:
- 原代码误将列名的前半段(如
Substrat 1)设为.value(要保留的目标列名),后半段(如Name)设为分组标识Substrat - 这导致pivot_longer试图把字符型的名称列和数值型的质量列合并到同一列,类型不兼容所以触发报错
正确代码
调整names_to的顺序,并修正正则表达式,让它正确拆分「底物编号」和「属性类型」:
library(tidyr) df <- tibble( ID = c("A", "B", "C"), LOC = c("GER", "FR", "GB"), `Substrat 1 Name` = c("silage", "slurry", "biowaste"), `Substrat 1 Menge in t` = c(10000, 5000, 3000), `Substrat 2 Name` = c("grass", "silage", "corn"), `Substrat 2 Menge in t` = c(6700, 3400, 1200), `Substrat 12 Name` = c("slurry", "grass", "silage"), `Substrat 12 Menge in t` = c(200, 4000, 3700) ) # 长格式转换代码 res <- df |> pivot_longer( cols = starts_with("Substrat"), # 自动匹配所有底物相关列,更灵活 names_to = c("Substrat", ".value"), names_pattern = "(Substrat \\d+)\\s(.+)", values_drop_na = TRUE )
代码说明
cols = starts_with("Substrat"):替代硬编码的列范围,自动匹配所有以Substrat开头的列,适配后续新增底物的场景names_to = c("Substrat", ".value"):- 第一个位置
Substrat:对应正则第一个分组,存储Substrat 1/Substrat 12这类编号标识 - 第二个位置
.value:对应正则第二个分组,将同属性的列(所有Name列、所有Menge in t列)合并为独立的目标列
- 第一个位置
names_pattern = "(Substrat \\d+)\\s(.+)":(Substrat \\d+):精准捕获「Substrat+数字」的编号部分(支持1、12这类多位数)\\s(.+):捕获空格后的剩余内容,即Name或Menge in t这类属性名
运行后输出完全匹配你的期望结果。
内容的提问来源于stack exchange,提问作者Hugo
相关产品推荐
相关产品推荐

