R语言新手求助:如何仅重塑数据框的部分列?
搞定R语言数据框重塑:告别base
reshape()的烦恼 嘿,作为刚接触R的新手,我太懂你对着reshape()函数抓耳挠腮的感觉了——base R里的这个函数参数设置真的有点反直觉,很容易踩坑!别着急,我给你推荐几个更简单顺手的工具,绝对能帮你轻松搞定数据框重塑~
首选推荐:用tidyr包的pivot_longer()/pivot_wider()
tidyr是tidyverse生态里的工具,语法清晰,新手友好,几乎能覆盖所有常见的重塑需求:
情况1:宽格式转长格式(比如把多列科目成绩转成按科目分组的长表)
假设你的原数据框是类似这样的宽格式:
# 模拟你的原数据框(用dput输出的结构大概是这样) df <- structure( list( ID = c(1, 2, 3), Math = c(80, 90, 75), English = c(85, 78, 92), Science = c(70, 82, 88) ), class = "data.frame", row.names = c(NA, -3L) )
如果期望转成长格式(每个ID+科目对应一行),用pivot_longer():
# 先加载tidyverse(包含tidyr) library(tidyverse) long_df <- df %>% pivot_longer( cols = -ID, # 指定不需要重塑的列(这里保留ID作为标识) names_to = "Subject", # 原列名要放到这个新列里 values_to = "Score" # 原列对应的值要放到这个新列里 )
运行后就能得到你想要的长表结构啦!
情况2:长格式转宽格式(反向操作)
如果是要把长表转回宽表,用pivot_wider():
wide_df <- long_df %>% pivot_wider( names_from = Subject, # 用哪一列的内容当新列名 values_from = Score # 用哪一列的内容当新列的值 )
经典备选:reshape2包的melt()和dcast()
如果你更习惯用经典的重塑工具,reshape2包的melt()(宽转长)和dcast()(长转宽)也很好用:
library(reshape2) # 宽转长 melted_df <- melt( df, id.vars = "ID", # 保留的标识列 variable.name = "Subject", # 存原列名的新列 value.name = "Score" # 存原值的新列 ) # 长转宽 casted_df <- dcast( melted_df, ID ~ Subject, # 行是ID,列是Subject的取值 value.var = "Score" # 填充到单元格的值来自Score列 )
为啥base的reshape()容易失败?
base R的reshape()参数多且逻辑绕,比如要实现上面的宽转长,你得这么写:
base_long <- reshape( df, direction = "long", varying = c("Math", "English", "Science"), # 要重塑的列 v.names = "Score", # 存值的列名 timevar = "Subject", # 存原列名的列名 times = c("Math", "English", "Science"), # 原列名的取值 idvar = "ID" # 标识列 ) # 还要手动清理行名 rownames(base_long) <- NULL
对比上面的tidyr/reshape2,是不是繁琐很多?新手很容易在varying、timevar这些参数上出错,所以更推荐前两种方法~
如果你的数据框结构和我模拟的不一样,或者有特殊的重塑需求,可以把你的dput输出补充上来,我再帮你调整代码!
内容的提问来源于stack exchange,提问作者varun carumbaiah
相关产品推荐
相关产品推荐

