R语言新手求助:使用dcast/melt/reshape无法完成数据重塑
嘿,我来帮你搞定这个数据重塑的问题!你想要把长格式的数据转成以DATALINEID为行、BATCHNUMBER为列的宽格式,之前的dcast用法没找对公式,我来给你拆解一下正确的实现方式。
问题核心梳理
你的原始数据是典型的长格式:
TESTCODE BATCHNUMBER BATCHVALUE DATALINEID
test 1 100 _83281
test 1 99 _83284
test 1 100 _83287
test 1 101 _83290
test 2 101 _83281
test 2 95 _83284
test 2 99 _83287
test 2 98 _83290
test 3 99 _83281
test 3 103 _83284
test 3 102 _83287
test 3 100 _83290
你期望的是把BATCHNUMBER转换成BATCH1/BATCH2/BATCH3作为列名,行由TESTCODE和DATALINEID共同标识,值对应BATCHVALUE。
正确的dcast用法
你之前的错误在于公式右侧没有正确指定要转换的列,也没给列名加上前缀。正确的公式需要把BATCHNUMBER转成我们想要的列名格式,代码如下:
# 假设你的数据框名为TEST library(data.table) # 用reshape2包的语法也完全一致 dcast(TEST, TESTCODE + DATALINEID ~ paste0("BATCH", BATCHNUMBER), value.var = "BATCHVALUE")
运行这段代码后,你会得到完全符合期望的结果:
TESTCODE DATALINEID BATCH1 BATCH2 BATCH3
test _83281 100 101 99
test _83284 99 95 103
test _83287 100 99 102
test _83290 101 98 100
更适合新手的tidyverse方法
如果你习惯用tidyverse工具链,tidyr::pivot_wider的语法更直观,参数命名清晰,新手更容易理解:
library(tidyr) TEST %>% pivot_wider( id_cols = c(TESTCODE, DATALINEID), # 指定作为行标识的列 names_from = BATCHNUMBER, # 从哪一列提取新列名 names_prefix = "BATCH", # 给新列名加上前缀 values_from = BATCHVALUE # 填充新列的值来源 )
这段代码会输出和上面完全一致的结果,逻辑也更贴近自然语言描述。
为什么你之前的尝试没成功?
- 第一次用
dcast(TEST,TESTCODE+DATALINEID ~., value.var = "BATCHVALUE"):~.表示对剩余所有列做聚合,默认聚合函数是length,所以得到的是每个TESTCODE+DATALINEID组合对应的BATCHVALUE数量(刚好3个)。 - 第二次用
dcast(TEST, TESTCODE+BATCHNUMBER ~ DATALINEID +., value.var = "BATCHVALUE"):你把BATCHNUMBER放在了行的位置,导致结果里行是TESTCODE+BATCHNUMBER,和你想要的TESTCODE+DATALINEID方向完全相反。
内容的提问来源于stack exchange,提问作者Santhosh N

