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

