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

R语言数据整理报错求助:pivot_longer与separate错误解决

问题场景

我有一个按秒记录的两站点暴露测量数据集,数据框包含以下列:

  • Second:秒数
  • SiteA_Number:SiteA的粒子数量
  • SiteA_Diam:SiteA的粒子直径
  • SiteA_LDSA:SiteA的LDSA值
  • SiteB_Number:SiteB的粒子数量
  • SiteB_Diam:SiteB的粒子直径
  • SiteB_LDSA:SiteB的LDSA值

数据结构如下:

'data.frame':   1800 obs. of  7 variables:
$ Second: num  1 2 3 4 5 6 7 8 9 10 ...
$ SiteA_Number : int  16673 19891 20370 17513 18185 18982 18362 17579 16605 15590 ...
$ SiteA_Diam : int  41 39 38 42 41 39 40 42 44 45 ...
$ SiteA_LDSA  : num  36.1 40.4 40.7 38.6 38.8 ...
$ SiteB_Number: int  15554 16745 17719 16494 15811 15331 16053 16196 15733 15521 ...
$ SiteB_Diam  : int  40 39 37 40 42 44 42 42 42 43 ...
$ SiteB_LDSA  : num  33 33.8 34.3 34.2 35.2 ...

需要将其转换为长格式,包含Second、Number、Diameter、LDSA和Station(取值为SiteA或SiteB)列,用于后续绘图。

错误原因分析

1. pivot_longer的错误

你之前的代码误用了names_transform参数:

  • names_transform是用来处理**拆分后生成的列(即Station列)**的类型转换,而数值列的类型转换应该用values_transform。
  • 另外你将LDSA转为integer会丢失小数精度,不符合数据实际类型。

2. separate的错误

separate函数仅支持对单个列进行拆分操作,不能同时传入多个列,它不是实现宽表转长表的正确工具。

正确解决方案

方法1:先统一列名再转长

先把直径列的名称修正为SiteA_Diameter和SiteB_Diameter,确保拆分后与目标列名一致:

library(tidyverse)

# 统一直径列名称
MergedLDSA <- MergedLDSA %>%
  rename(SiteA_Diameter = SiteA_Diam,
         SiteB_Diameter = SiteB_Diam)

# 转换为长格式
long_data <- MergedLDSA %>%
  pivot_longer(
    cols = -Second,  # 排除秒数列,其余列转为长格式
    names_to = c("Station", ".value"),  # 拆分列名为站点标识和值列名
    names_sep = "_",  # 按下划线拆分列名
    values_transform = list(
      Number = as.integer,
      Diameter = as.integer,
      LDSA = as.numeric  # 保留LDSA的小数精度
    )
  )

方法2:直接用正则匹配列名(无需重命名)

如果不想修改原数据列名,可以用names_pattern匹配并映射列名:

library(tidyverse)

long_data <- MergedLDSA %>%
  pivot_longer(
    cols = -Second,
    names_to = c("Station", ".value"),
    # 正则匹配站点和指标部分
    names_pattern = "^(SiteA|SiteB)_(Number|Diam|LDSA)$",
    # 将匹配到的"Diam"替换为目标列名"Diameter"
    names_transform = list(.value = ~ ifelse(.x == "Diam", "Diameter", .x)),
    values_transform = list(
      Number = as.integer,
      Diameter = as.integer,
      LDSA = as.numeric
    )
  )

执行后得到的long_data就是符合要求的长格式数据,可以直接用于绘制X轴为时间、Y轴为粒子数量、按站点区分的图表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:02:03