如何使用R将长格式数据转宽格式?已尝试dcast/reshape未果
解决长格式转宽格式的问题
你之前用dcast()或reshape()失败,核心原因是没有给每个分组内的MVal条目添加区分序号——这类转宽操作需要明确每个组内的第1、2、3个值对应到宽表的哪一列。
下面给你两种可行的实现方法:
方法1:用dplyr + tidyr(tidyverse生态)
先给每个Poly+Subclass的分组添加组内行号,再用pivot_wider转宽:
# 加载包 library(dplyr) library(tidyr) # 构造你的数据(如果是读入本地数据,替换为read.table("你的文件路径", header=TRUE)) df <- data.frame( MVal = c(29.44,29.39,26.11,24.21,26.60,28.32,32.28,31.91,33.58,25.00,26.64,23.67,25.20,26.44,23.87,21.21,19.30,21.97,21.79,18.16,20.30), Poly = c(rep("Mono",15), rep("Di",6)), Subclass = c(rep("G",3), rep("F",3), rep("R",3), rep("E",3), rep("P",3), rep("G",3), rep("F",3)) ) # 第一步:给每个分组添加组内行号 df <- df %>% group_by(Poly, Subclass) %>% mutate(id = paste0("MVal_", row_number())) %>% ungroup() # 第二步:转宽格式 wide_df <- df %>% pivot_wider(names_from = id, values_from = MVal) # 查看结果 print(wide_df)
方法2:用data.table的dcast
如果你习惯用data.table,同样需要先添加组内行号,再用dcast:
library(data.table) # 转换为data.table格式 dt <- as.data.table(df) # 添加组内行号 dt[, id := paste0("MVal_", .I), by = .(Poly, Subclass)] # 转宽格式 wide_dt <- dcast(dt, Poly + Subclass ~ id, value.var = "MVal") # 查看结果 print(wide_dt)
两种方法都会生成你需要的宽格式:每个Poly+Subclass组合作为一行,对应的3个MVal值分别对应MVal_1、MVal_2、MVal_3列。
内容的提问来源于stack exchange,提问作者The August
相关产品推荐
相关产品推荐

