如何用pivot_longer替代reshape2::melt实现矩阵转长格式?
使用pivot_longer替代reshape2::melt处理矩阵转长格式
等价实现代码
原reshape2::melt的矩阵转长格式操作,用tidyr::pivot_longer实现的等价代码如下:
library(tidyr) library(dplyr) foo <- matrix(1:9, 3, 3) # 转换为长格式,与melt结果完全一致 foo %>% as.data.frame() %>% mutate(x = row_number()) %>% pivot_longer(cols = -x, names_to = "y", values_to = "z") %>% mutate(y = as.integer(sub("V", "", y))) %>% select(x, y, z)
关键说明
pivot_longer针对数据框设计,因此先将矩阵转为数据框格式;- 通过
row_number()生成对应原矩阵行索引的x列,匹配melt的行位置标识; - 用
pivot_longer把除x外的所有列转成长格式,列名存入y、对应值存入z; - 矩阵转数据框后列名默认是
V1/V2/V3,通过sub提取数字并转为整数,得到melt生成的数值型列索引; - 最后用
select调整列顺序,保证输出结构和reshape2::melt完全一致。
如果不想依赖dplyr,也可以用base R实现:
library(tidyr) foo <- matrix(1:9, 3, 3) # 构建带行索引的数据框 df <- data.frame(x = 1:nrow(foo), foo) # 转长格式 df_long <- pivot_longer(df, cols = -x, names_to = "y", values_to = "z") # 转换y为数值型索引 df_long$y <- as.integer(sub("V", "", df_long$y))
内容的提问来源于stack exchange,提问作者user111024
相关产品推荐
相关产品推荐

