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

