R语言如何将含多标识列的长格式数据转换为宽格式
R长表转宽表实现方案
你可以通过以下几种方式实现需求,之前使用spread()失败是因为该函数仅支持单个列作为生成列名的key,需要先拼接method和parameter两列,或使用更新的pivot_wider()函数直接指定多列生成列名:
方法1:使用tidyr::pivot_wider(推荐)
该函数为spread()的官方替代方案,原生支持多列组合生成列名:
# 加载包,tidyr版本需≥1.0.0 library(tidyr) wide_data <- pivot_wider( mydata, id_cols = sample_ID, # 指定行唯一标识列 names_from = c(method, parameter), # 指定用于生成列名的两个列 names_sep = "_", # 指定列名拼接分隔符 values_from = value # 指定取值来源列 )
输出结果完全符合你的要求,sample_ID为1的行将自动生成A_M1、B_M1、A_M2、B_M2四列,对应数值正确。
方法2:使用spread()实现
如果要继续使用spread(),需要先手动拼接生成key列:
library(tidyr) library(dplyr) wide_data <- mydata %>% mutate(col_key = paste(method, parameter, sep = "_")) %>% # 拼接生成列名 select(sample_ID, col_key, value) %>% spread(key = col_key, value = value)
方法3:基础R原生reshape实现
无需加载第三方包的实现方式:
wide_data <- reshape( mydata, idvar = "sample_ID", timevar = c("method", "parameter"), direction = "wide", sep = "_" ) # 去掉列名默认带的value_前缀 names(wide_data) <- sub("^value_", "", names(wide_data))
内容的提问来源于stack exchange,提问作者MDStat
相关产品推荐
相关产品推荐

