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无法识别哪些列属于同一用户组,因此出现重复观测或结构混乱的问题。直接基于原始列名的模式匹配重塑,才是更可靠的方式。
提问表述优化建议
- 明确说明使用的R包:比如你用到了
data.table的setDT和melt,但未标注包名,他人可能混淆是reshape2还是data.table的melt - 提供可复现的示例数据:用
dput(df)输出你的小样本数据,方便他人直接复制测试 - 描述错误结果的具体表现:比如“重复观测值”是每行重复多少次?“打乱结构”后的输出是什么样的?附上错误示例更有助于定位问题
内容的提问来源于stack exchange,提问作者mr-lingsteen
相关产品推荐
相关产品推荐

