R语言拆分data.frame矩阵列 无需中间转矩阵且保留类型与列名
方案1:Base R实现(无额外依赖)
核心逻辑是逐列判断类型,仅拆分矩阵列,全程不做全表类型强制转换:
flatten_matrix_cols <- function(df) { col_list <- lapply(seq_along(df), function(idx) { current_col <- df[[idx]] if (is.matrix(current_col)) { # 矩阵列直接转data.frame,自动继承矩阵的列名后缀 as.data.frame(current_col, check.names = FALSE) } else { # 普通列直接保留,手动指定原列名避免自动重命名 structure(data.frame(current_col, check.names = FALSE), names = names(df)[idx]) } }) do.call(cbind, c(col_list, check.names = FALSE)) } # 用示例数据测试 m4 <- flatten_matrix_cols(m)
执行后查看结构:
str(m4, give.attr = FALSE) # 输出: # 'data.frame': 32 obs. of 3 variables: # $ cbind(gear, am).gear: num 4 4 4 3 3 3 3 4 4 4 ... # $ cbind(gear, am).am : num 1 1 1 0 0 0 0 0 0 0 ... # $ car : chr "Mazda RX4" "Mazda RX4 Wag" "Datsun 710" "Hornet 4 Drive" ...
完全满足要求:数值列保留数值类型,字符列保留字符类型,列名和as.data.frame(as.matrix())的输出完全一致。
方案2:tidyverse极简实现
如果可以依赖tidyverse生态,用tidyr::unnest_wider一行代码搞定:
library(tidyr) m4 <- unnest_wider(m, `cbind(gear, am)`, names_sep = ".")
输出效果和base R方案完全一致。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

