【问题标题】:How to convert a table to a data frame如何将表格转换为数据框
【发布时间】:2012-06-01 07:18:29
【问题描述】:

我在 R 中有一个表,其中包含 str()

 table [1:3, 1:4] 0.166 0.319 0.457 0.261 0.248 ...
 - attr(*, "dimnames")=List of 2
  ..$ x: chr [1:3] "Metro >=1 million" "Metro <1 million" "Non-Metro Counties"
  ..$ y: chr [1:4] "q1" "q2" "q3" "q4"

当我打印它时看起来像这样:

                    y
x                           q1        q2        q3        q4
  Metro >=1 million  0.1663567 0.2612212 0.2670441 0.3053781
  Metro <1 million   0.3192857 0.2480012 0.2341030 0.1986102
  Non-Metro Counties 0.4570341 0.2044960 0.2121102 0.1263597

我想去掉xy 并将其转换为看起来与上面完全相同的数据框(三行四列),但没有xy .如果我使用as.data.frame(mytable),我会得到这个:

                    x  y      Freq
1   Metro >=1 million q1 0.1663567
2    Metro <1 million q1 0.3192857
3  Non-Metro Counties q1 0.4570341
4   Metro >=1 million q2 0.2612212
5    Metro <1 million q2 0.2480012
6  Non-Metro Counties q2 0.2044960
7   Metro >=1 million q3 0.2670441
8    Metro <1 million q3 0.2341030
9  Non-Metro Counties q3 0.2121102
10  Metro >=1 million q4 0.3053781
11   Metro <1 million q4 0.1986102
12 Non-Metro Counties q4 0.1263597

我可能根本不理解表格与数据框的关系。

【问题讨论】:

  • 搜索时,我很惊讶在 SO 上找到类似问题是多么困难。这是一个:stackoverflow.com/questions/5855225/… 这是一个非常基本的操作,在?xtabs 中进行了描述(不一定是最明显的位置。)
  • 很确定您需要做的就是在对table的调用中设置deparse.level = 0(或可能是2)

标签: r dataframe


【解决方案1】:

我已经想通了:

as.data.frame.matrix(mytable) 

做我需要的——显然,表格需要以某种方式转换为矩阵,以便适当地转换为数据框。我发现了更多关于这个as.data.frame.matrix() function for contingency tables at the Computational Ecology blog的细节。

【讨论】:

  • 或者只是as.data.frame(mytable)。 (is.matrix(mytable) 将揭示表实际上只是修饰过的矩阵,as.data.frame.matrix 是在 as.data.frame() 传递矩阵参数时被调度的方法。)
  • Josh - 在顶部显示的示例中,as.data.frame(mytable) 没有工作 - 这就是维克多问这个问题的原因,我想?你能澄清一下吗?
  • @HeatherStark 我怀疑这是因为实际上发送的是as.data.frame.table,而不是不太具体的as.data.frame.matrix
  • 非常好的发现。我唯一不喜欢的是我的 xtab 因子(第一个“列”)变成了row.names。我已经设法使用row.names 值添加一列,但我宁愿首先阻止as.data.frame.matrix 写入row.names ..
  • as.data.frame.matrix(table(x)) 给了我Error in seq_len(ncols) : argument must be coercible to non-negative integer,而as.data.frame(table(x)) 有效,其中x 只是一个数字向量c(1,2,...)
【解决方案2】:

简答:使用as.data.frame.matrix(mytable),正如@Victor Van Hee 建议的那样。

长答案:as.data.frame(mytable) 可能不适用于table() 函数生成的列联表,即使is.matrix(your_table) 返回TRUE。它仍然会将您的表格融化为factor1 factor2 factori counts 格式。

例子:

> freq_t = table(cyl = mtcars$cyl, gear = mtcars$gear)

> freq_t
   gear
cyl  3  4  5
  4  1  8  2
  6  2  4  1
  8 12  0  2

> is.matrix(freq_t)
[1] TRUE

> as.data.frame(freq_t)
  cyl gear Freq
1   4    3    1
2   6    3    2
3   8    3   12
4   4    4    8
5   6    4    4
6   8    4    0
7   4    5    2
8   6    5    1
9   8    5    2
> as.data.frame.matrix(freq_t)
   3 4 5
4  1 8 2
6  2 4 1
8 12 0 2

【讨论】:

    【解决方案3】:

    如果你使用tidyverse,你可以使用

    as_data_frame(table(myvector))
    

    获取tibble(即与基类有一些细微变化的数据框)

    【讨论】:

    • 取决于你想使用数据框或小标题
    【解决方案4】:

    虽然在这种情况下结果会有所不同,因为列名是数字,但我使用的另一种方法是 data.frame(rbind(mytable))。使用来自@X.X 的示例:

    > freq_t = table(cyl = mtcars$cyl, gear = mtcars$gear)
    
    > freq_t
       gear
    cyl  3  4  5
      4  1  8  2
      6  2  4  1
      8 12  0  2
    
    > data.frame(rbind(freq_t))
      X3 X4 X5
    4  1  8  2
    6  2  4  1
    8 12  0  2
    

    如果列名不以数字开头,X 将不会添加到它们的前面。

    【讨论】:

    • 这实际上也比我的示例中返回错误的 as.data.frame.matrix 工作得更好: out as.data.frame.matrix(out) 错误in d[[2L]] : 下标越界
    【解决方案5】:

    已弃用:

    as.data.frame(my_table)
    

    改用这个包:

    library("quanteda")
    convert(my_table, to="data.frame") 
    

    【讨论】:

    • convert 不是正态 R 分布的一部分。我得到了could not find function "convert"你需要什么库?
    • 库(“quanteda”)
    • 看起来as.data.frame 根本没有被弃用。至少我没有收到任何弃用警告。当然,他们不会弃用它以支持外部包。
    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2019-06-26
    相关资源
    最近更新 更多