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

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
  )

代码说明

  1. cols = starts_with("Substrat"):替代硬编码的列范围,自动匹配所有以Substrat开头的列,适配后续新增底物的场景
  2. names_to = c("Substrat", ".value"):
    • 第一个位置Substrat:对应正则第一个分组,存储Substrat 1/Substrat 12这类编号标识
    • 第二个位置.value:对应正则第二个分组,将同属性的列(所有Name列、所有Menge in t列)合并为独立的目标列
  3. names_pattern = "(Substrat \\d+)\\s(.+)":
    • (Substrat \\d+):精准捕获「Substrat+数字」的编号部分(支持1、12这类多位数)
    • \\s(.+):捕获空格后的剩余内容,即Name或Menge in t这类属性名

运行后输出完全匹配你的期望结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 11:52:13