如何在R中保留原结构将table转换为dataframe?
在R中保留三维Table结构转换为DataFrame的方法
你拥有一个三维Table对象,其结构包含物种(行)、牙齿类型(列)、以及L/U两个维度。使用as.data.frame()默认转换会得到长格式DataFrame,若要保留原Table的宽表显示结构,可以通过以下几种方式实现:
原Table对象
sample_size <- structure(c(0L, 2L, 2L, 0L, 3L, 1L, 3L, 9L, 13L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 2L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 6L, 0L, 9L, 2L, 0L, 0L, 1L, 0L, 0L, 8L, 0L, 6L, 1L, 0L, 0L, 2L, 1L, 3L, 16L, 10L, 0L, 2L, 0L, 0L, 6L, 33L, 4L, 30L, 18L, 3L, 0L, 14L, 1L, 12L, 40L, 1L, 13L, 9L, 0L, 0L, 0L, 0L, 11L, 25L, 1L, 5L, 2L, 0L, 2L, 0L, 0L, 1L, 16L, 2L, 17L, 1L, 0L, 2L, 0L, 0L, 2L, 19L, 2L, 3L, 1L, 0L, 1L, 0L, 3L, 4L, 17L, 0L, 2L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 2L, 0L, 2L, 4L, 1L, 0L, 2L, 0L, 0L, 2L, 0L, 3L, 7L, 2L, 4L, 10L, 16L, 4L, 2L, 0L, 22L, 11L, 31L, 7L, 8L, 18L, 3L, 3L, 1L, 21L, 8L, 31L, 4L, 10L, 11L, 3L, 2L, 0L, 19L, 5L, 29L, 4L, 6L, 16L, 2L, 1L, 2L, 11L, 12L, 27L, 6L, 7L, 14L, 2L, 0L, 2L, 14L, 9L, 35L), dim = c(9L, 11L, 2L), dimnames = structure(list( c("Ardipithecus ramidus", "Australopithecus afarensis", "Australopithecus africanus", "Australopithecus anamensis", "Early Homo", "Homo erectus", "Homo habilis", "Paranthropus boisei", "Paranthropus robustus" ), c("C", "dc", "dm1", "dm2", "I1", "I2", "M1", "M2", "M3", "P3", "P4"), c("L", "U")), names = c("", "", "")), class = "table")
方法1:合并L/U维度到列名,生成单一宽表
使用tidyr和dplyr包将长格式数据重塑为宽表,把L/U作为列名后缀:
library(tidyr) library(dplyr) # 转换为长格式DataFrame sample_size_long <- as.data.frame(sample_size) # 合并牙齿类型与维度,重塑为宽表 sample_size_wide <- sample_size_long %>% unite(col = "Tooth_Dimension", Var2, Var3, sep = "_") %>% pivot_wider(names_from = Tooth_Dimension, values_from = Freq) # 查看结果 head(sample_size_wide)
该方法会生成一个以物种为行,以C_L、C_U、dc_L等为列的宽表,完整保留所有维度数据。
方法2:使用基础R实现宽表转换
无需额外包,用基础R的reshape函数完成转换:
sample_size_long <- as.data.frame(sample_size) # 重塑为宽表 sample_size_wide_base <- reshape(sample_size_long, idvar = "Var1", timevar = c("Var2", "Var3"), direction = "wide") # 清理列名(去除默认的"Freq."前缀) colnames(sample_size_wide_base) <- gsub("Freq\\.", "", colnames(sample_size_wide_base)) # 查看结果 head(sample_size_wide_base)
方法3:拆分L/U为独立DataFrame(与原Table子表结构完全一致)
如果希望保留原Table中L和U两个独立子表的结构,可以分别提取转换:
# 提取L维度并转换为DataFrame df_L <- as.data.frame.matrix(sample_size[,, "L"]) # 添加物种列并调整顺序 df_L$Species <- rownames(df_L) df_L <- df_L %>% select(Species, everything()) # 提取U维度并转换为DataFrame df_U <- as.data.frame.matrix(sample_size[,, "U"]) df_U$Species <- rownames(df_U) df_U <- df_U %>% select(Species, everything()) # 查看L维度的结果 head(df_L)
此方法会得到两个DataFrame,分别对应原Table的L和U子表,结构与原Table显示的完全一致。
内容的提问来源于stack exchange,提问作者antecessor
相关产品推荐
相关产品推荐

