Что ж, точная причина для "почему" заключается в том, что это исходный код для 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
с некоторыми атрибутами.Когда вы набираете tbl
и нажимаете <ENTER>
в консоли R, он вызывает print.table()
(введите print.table
без других знаков препинания в консоли R, чтобы увидеть его источник), он проходит через несколько циклов, чтобы напечатать то, что вы видите как«прямоугольная» структура данных.
Чтобы получить желаемый результат, просто сделайте то, что в конечном итоге делает функция печати (не так-то просто):
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