我正在尝试将表转换为数据表。
示例:
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
答案 0 :(得分:6)
好吧,“为什么” 的精确原因是这是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
并按下<ENTER>
时,它会调用print.table()
(在R控制台中输入print.table
且没有其他标点符号来查看其来源),它将经历一些箍打印出您所看到的“矩形”数据结构。
要获得所需的结果,只需执行打印功能最终要做的事情(不是那么简单):
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