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

R语言:如何将简单数据框从长格式转为目标宽格式?

嘿,这个问题其实很好解决,你之前用spread的时候多此一举加了id列,反而把事情搞复杂啦!给你几个简单的解决方案:

方案1:正确使用tidyr::spread(无需额外ID)

你之前错误地添加了id列,导致spread把每条记录拆成了单独的行。其实直接对原数据调用spread就能得到你想要的单行宽格式:

library(tidyr)
df <- data.frame(origin = c('A', 'B', 'C'), freq = c(100,3000,200))
wide_df <- df %>% spread(origin, freq)
wide_df
# 输出结果:
#    A    B   C
# 1 100 3000 200

这个结果可以直接用cbind和其他数据框合并。

方案2:用更现代的tidyr::pivot_wider

spread是旧版函数,现在官方更推荐用pivot_wider,用法更直观,同样不需要额外ID:

library(tidyr)
wide_df <- df %>% pivot_wider(names_from = origin, values_from = freq)

输出和上面完全一致,而且处理复杂数据集时灵活性更强。

方案3:修复转置的方法

如果你还是想用转置的思路,可以手动调整列名和数据行,几步就能搞定:

# 先转置原数据框
transposed <- t(df)
# 把转置后的第一行(origin的取值)设为列名
colnames(transposed) <- transposed[1, ]
# 提取第二行(freq的取值)转成数据框,同时清除行名
wide_df <- as.data.frame(transposed[-1, , drop = FALSE])
rownames(wide_df) <- NULL

这样也能得到你需要的目标结构。

方案4:极简构造法

如果追求最简洁的代码,可以用setNames配合t一步到位:

wide_df <- setNames(data.frame(t(df$freq)), df$origin)

这个方法特别适合这种简单的键值对转宽表场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:03:38