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

使用sparseMatrix对含字符值的数据框执行Pivot/Dcast操作

使用sparseMatrix()实现数据透视(Pivot/Dcast)

嘿,我来帮你搞定这个需求!先确认下你的原始数据和目标:

原始数据构建代码

id <- c(1,2,2,2,2,3,3,3,4,4)
col <- c("a","a","b","c","d","b","c","d","a","b")
val <- as.character(c("t1","x1","x2","x3","x4","y2","y3","y4","z1","z2"))
values <- data.frame(id,col,val, stringsAsFactors = FALSE)

原始数据输出

> values
   id col val
1  1   a  t1
2  2   a  x1
3  2   b  x2
4  2   c  x3
5  2   d  x4
6  3   b  y2
7  3   c  y3
8  3   d  y4
9  4   a  z1
10 4   b  z2

接下来我们用Matrix包的sparseMatrix()来实现透视,核心是把id和col转成整数索引,再映射对应的值:

具体实现步骤

  • 安装并加载Matrix包(如果还没安装的话):
install.packages("Matrix")
library(Matrix)
  • 转换索引并构建稀疏矩阵:
    sparseMatrix()需要整数类型的行列索引,所以先把col转换成整数编码,再传入参数构建矩阵:
# 将col转换为整数编码(比如a=1, b=2, c=3, d=4)
values$col_idx <- match(values$col, unique(values$col))

# 构建稀疏矩阵
sparse_mat <- sparseMatrix(
  i = values$id,          # 行索引:使用原始id列
  j = values$col_idx,     # 列索引:转换后的col整数编码
  x = values$val,         # 填充的对应值
  dimnames = list(
    rownames = unique(values$id),
    colnames = unique(values$col)
  )                       # 设置行列名称,让结果更直观
)
  • 查看最终结果:
    运行后你会得到一个结构清晰的稀疏矩阵,输出如下:
> sparse_mat
4 x 4 sparse Matrix of class "dgCMatrix"
  a    b    c    d   
1 "t1" .    .    .   
2 "x1" "x2" "x3" "x4"
3 .    "y2" "y3" "y4"
4 "z1" "z2" .    .   

额外小提示

  • 如果需要把稀疏矩阵转回普通数据框,可以用as.data.frame(as.matrix(sparse_mat)),但这样会失去稀疏矩阵节省内存的优势,适合小数据场景。
  • 要是只是想实现透视,reshape2的dcast()或者tidyr的pivot_wider()也能搞定,但sparseMatrix()在处理超大数据集时性能和内存占用会更友好。

内容的提问来源于stack exchange,提问作者Rushabh Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:25:02