将表格转换为数据框的最佳方法是什么?

11 浏览
0 Comments

将表格转换为数据框的最佳方法是什么?

我在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

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

0
0 Comments

最佳的方法将一个表格转换为数据框是使用as.data.frame.matrix(mytable)函数。这是因为表格需要先转换为矩阵,然后才能适当地转换为数据框。这个问题的解决方法可以在Computational Ecology博客的as.data.frame.matrix()函数对于列联表的更多细节。中找到。

还可以使用as.data.frame(mytable)函数。通过is.matrix(mytable)函数可以发现表格实际上是矩阵,而当as.data.frame()函数接收到一个矩阵参数时,会分派给as.data.frame.matrix方法。

在示例中,as.data.frame(mytable)函数似乎不起作用,这可能是Victor提出这个问题的原因。请Josh明确一下。

我怀疑这是因为实际上是调用了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,...)

它不起作用,行名称被添加到每个条目中,而不是作为行名称保存在数据框中。

这是一个处理row.names问题的小函数:dftbls <- function (x) { f <- as.data.frame.matrix(x, stringsAsFactors = F) f <- cbind(row.names(f), f) row.names(f) <- NULL names(f)[1] <- "Data" return(f) }

0