如何用reshape或dcast将无value.var的两列长表转宽表?
解决方案:将长格式data.frame转换为宽格式
刚好碰到过类似的需求,给你两个靠谱的实现方案,都是你提到的dcast和reshape方法,先模拟你的数据集方便测试:
# 模拟你的原始数据 df <- data.frame( blocksequenceid = c("M049-S215-S085", "M049-S215-S085", "M049-S215-S085", "M049-S213-S044", "M049-S213-S044", "M049-S213-S044"), description = c("ECDTM-49", "ICD-215", "ICD-85", "ECDTM-49", "ICD-213", "ICD-44") )
方法一:使用data.table的dcast
dcast是处理宽长转换非常高效的工具,步骤如下:
- 给每个
blocksequenceid分组内的行添加序号,标记是第几个描述; - 用
dcast将行转成列。
library(data.table) # 转换为data.table对象 setDT(df) # 生成分组内的序号列 df[, desc_num := paste0("description", 1:.N), by = blocksequenceid] # 转宽格式 wide_df <- dcast(df, blocksequenceid ~ desc_num, value.var = "description")
运行后wide_df就是你想要的格式,每个blocksequenceid对应一行,三个描述列。
方法二:使用基础R的reshape函数
如果不想加载额外包,基础R的reshape也能搞定,同样需要先添加分组序号:
# 生成分组内的序号列 df$desc_num <- with(df, ave(rep(1, nrow(df)), blocksequenceid, FUN = seq_along)) # 调用reshape转宽 wide_df <- reshape(df, idvar = "blocksequenceid", # 分组的ID列 timevar = "desc_num", # 用来区分同一组内不同行的列 direction = "wide", # 转换方向为宽格式 sep = "") # 列名的分隔符,留空就会生成description1这种格式
两种方法都能得到你需要的结果,根据自己的包偏好选择就行~
内容的提问来源于stack exchange,提问作者Beeba
相关产品推荐
相关产品推荐

