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

使用R的reshape2包melt函数拆分列头转换宽表为长表

宽转长格式并拆分列头的解决方案

下面提供两种常用的R语言实现方案,你可以根据自己的习惯选择:


方法一:使用data.table包(兼容你提到的melt操作)

# 加载data.table包
library(data.table)

# 构造示例宽格式数据(替换成你的真实数据即可)
dt_wide <- data.table(
  TAXON = c("SpeciesA", "SpeciesB", "SpeciesC"),
  ORRU_CL.rod = c(10, 5, 3),
  ORRU_CL.louis = c(12, 7, 4),
  BONE_CL.john2 = c(8, 6, 2)
)

# 第一步:转长格式,保留TAXON作为ID变量
dt_long <- melt(dt_wide, id.vars = "TAXON", variable.name = "SITE_USER", value.name = "ABUNDANCE")

# 第二步:按"."拆分SITE_USER列,生成SITE和USER新列
dt_long[, c("SITE", "USER") := tstrsplit(SITE_USER, "\\.")]

# 可选:删除中间的SITE_USER列
dt_long[, SITE_USER := NULL]

方法二:使用tidyr包(tidyverse生态,一步到位更简洁)

# 加载tidyverse包
library(tidyverse)

# 构造示例宽格式数据
df_wide <- tibble(
  TAXON = c("SpeciesA", "SpeciesB", "SpeciesC"),
  ORRU_CL.rod = c(10, 5, 3),
  ORRU_CL.louis = c(12, 7, 4),
  BONE_CL.john2 = c(8, 6, 2)
)

# 一步完成转长+列头拆分
df_long <- df_wide %>%
  pivot_longer(
    cols = -TAXON,  # 排除TAXON,其他列都转成长格式
    names_to = c("SITE", "USER"),  # 拆分后生成的两个列名
    names_sep = "\\.",  # 拆分分隔符(注意用\\.转义,因为.在正则里是通配符)
    values_to = "ABUNDANCE"  # 存储丰度值的列名
  )

关键注意点

  • 拆分分隔符.需要转义成\\.,因为在正则表达式中,单个.代表匹配任意字符,必须转义后才会匹配真实的点号。
  • 如果你的列头有多个点号(比如SITE.USER.extra),可以用names_pattern指定正则匹配规则,比如names_pattern = "(.*)\\.(.*)\\.(.*)"来拆分成多列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:45:56