You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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是处理宽长转换非常高效的工具,步骤如下:

  1. 给每个blocksequenceid分组内的行添加序号,标记是第几个描述;
  2. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:10:52