【问题标题】:Conversion of table to data frame表格到数据框的转换
【发布时间】:2019-03-15 20:39:04
【问题描述】:

我正在尝试将转换 表格 数据框

例子:

tbl <- structure(c(1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L), .Dim = c(4L, 2L), .Dimnames = structure(list(
c("1", "2", "3", "4"), colNames = c("2013 3", "2014 12")), .Names = c("", "colNames")), class = "table")

colNames
     2013 3 2014 12
1      1       1
2      0       0
3      0       0
4      0       0

转换为数据框会导致完全不同的数据结构。为什么?

as.data.frame(tbl)

Var1 colNames Freq
1    1   2013 3    1
2    2   2013 3    0
3    3   2013 3    0
4    4   2013 3    0
5    1  2014 12    1
6    2  2014 12    0
7    3  2014 12    0
8    4  2014 12    0

【问题讨论】:

  • 我不相信这是一个 dup @Jilber Urbina,因为 OP 想知道 为什么
  • 来自?as.data.frame.table:“从类“table”继承的对象的as.data.frame方法可用于将列联表的基于数组的表示转换为包含分类的数据框因素和相应的条目(后者作为由 responseName 命名的组件)。” 我认为这只是意味着它是一种设计选择。 (也就是说,它并没有真正回答“为什么”)
  • 不清楚这里的“为什么”是什么意思。对于具有多于或少于两个维度的表(例如table(mtcars[9:11])),有什么替代方案可以始终如一地表现?

标签: r dataframe


【解决方案1】:

嗯,精确 原因在于 “为什么”as.data.frame.table 的源代码(只需在 R 控制台中输入该名称,不要使用其他名称)标点符号可以在控制台中看到):

function(x, row.names = NULL, ..., responseName = "Freq", 
         stringsAsFactors = TRUE, sep = "", base = list(LETTERS))  {

  ex <- quote(
    data.frame(
      do.call(
        "expand.grid", 
        c(
          dimnames(provideDimnames(x, sep = sep, base = base)), 
          KEEP.OUT.ATTRS = FALSE, 
          stringsAsFactors = stringsAsFactors)
      ), 
      Freq = c(x), row.names = row.names)
  )
  names(ex)[3L] <- responseName
  eval(ex)

}

最终,你拥有什么:

tbl <- structure(
  c(1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L), 
  .Dim = c(4L, 2L), 
  .Dimnames = structure(
    list(
      c("1", "2", "3", "4"), 
      colNames = c("2013 3", "2014 12")
    ), 
    .Names = c("", "colNames")
  ), 
  class = "table"
)

是一个带有一些属性的integer 向量。当您在 R 控制台中键入 tbl 并点击 &lt;ENTER&gt; 时,它正在调用 print.table()(在 R 控制台中输入 print.table 而没有其他标点符号以查看其源代码)它会经过一些循环来打印您所看到的“矩形”数据结构。

要获得您想要的结果,只需执行 print 函数最终会执行的操作(以一种不那么直接的方式):

as.data.frame.matrix(tbl)

或使用 tidyverse 成语:

as.data.frame(tbl) %>% 
  tidyr::spread(colNames, Freq)
##   Var1 2013 3 2014 12
## 1    1      1       1
## 2    2      0       0
## 3    3      0       0
## 4    4      0       0

【讨论】:

  • @hbmstr: 解决方案在多个矩阵上成功测试
猜你喜欢
  • 2022-11-30
  • 1970-01-01
  • 2019-04-19
  • 2018-01-02
  • 2015-11-30
  • 2012-06-01
  • 1970-01-01
相关资源
最近更新 更多