使用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
相关产品推荐
相关产品推荐

