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

R语言:将单行多列DataFrame从宽格式转换为长格式

解决方案

方法1:使用tidyr(tidyverse生态)

这种方法更直观,直接利用原始列名的模式拆分并重塑:

library(tidyr)
library(dplyr)

# 基于原始列名结构进行重塑
df_long <- df %>%
  pivot_longer(
    cols = everything(),
    names_to = c(".value", "user_idx"),
    names_pattern = "user_(\\d+)_(.*)"
  ) %>%
  select(-user_idx) # 不需要用户序号的话可删除此列

方法2:使用data.table

如果你习惯用data.table的melt,可以通过patterns指定同属性的列组:

library(data.table)

setDT(df)
df_long <- melt(df, 
                measure.vars = patterns("_id$", "_name$", "_sex$"),
                value.name = c("id", "name", "sex"))[, variable := NULL]

你之前操作的问题所在

你先修改列名的操作会导致id/name/sex列名重复,melt无法识别哪些列属于同一用户组,因此出现重复观测或结构混乱的问题。直接基于原始列名的模式匹配重塑,才是更可靠的方式。


提问表述优化建议
  1. 明确说明使用的R包:比如你用到了data.table的setDT和melt,但未标注包名,他人可能混淆是reshape2还是data.table的melt
  2. 提供可复现的示例数据:用dput(df)输出你的小样本数据,方便他人直接复制测试
  3. 描述错误结果的具体表现:比如“重复观测值”是每行重复多少次?“打乱结构”后的输出是什么样的?附上错误示例更有助于定位问题

内容的提问来源于stack exchange,提问作者mr-lingsteen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:17:12