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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:15:03