объекты.
гда используюftable
Функция исключительно для представления иерархических категорий. Тем не менее, иногда, когда таблица большая, я хотел бы дополнительно поднабор таблицы перед ее использованием.
Допустим, мы начинаем с:
mytable <- ftable(Titanic, row.vars = 1:3)
mytable
## Survived No Yes
## Class Sex Age
## 1st Male Child 0 5
## Adult 118 57
## Female Child 0 1
## Adult 4 140
## 2nd Male Child 0 11
## Adult 154 14
## Female Child 0 13
## Adult 13 80
## 3rd Male Child 35 13
## Adult 387 75
## Female Child 17 14
## Adult 89 76
## Crew Male Child 0 0
## Adult 670 192
## Female Child 0 0
## Adult 3 20
str(mytable)
## ftable [1:16, 1:2] 0 118 0 4 0 154 0 13 35 387 ...
## - attr(*, "row.vars")=List of 3
## ..$ Class: chr [1:4] "1st" "2nd" "3rd" "Crew"
## ..$ Sex : chr [1:2] "Male" "Female"
## ..$ Age : chr [1:2] "Child" "Adult"
## - attr(*, "col.vars")=List of 1
## ..$ Survived: chr [1:2] "No" "Yes"
## NULL
Потому что нетdimnames
Я не могу извлечь данные так же, как с объектом, который имеетdimnames
, Например, я не могу напрямую извлечь все значения «Child» из «1st» и «3rd» классов.
Мой текущий подход заключается в преобразовании его вtable
, выполнить извлечение, а затем преобразовать его обратно вftable
.
Пример:
mytable[c("1st", "3rd"), , "Child", ]
## Error: incorrect number of dimensions
## Only the underlying data are seen as having dims
dim(mytable)
## [1] 16 2
## I'm OK with the "Age" column being dropped in this case....
ftable(as.table(mytable)[c("1st", "3rd"), , "Child", ])
## Survived No Yes
## Class Sex
## 1st Male 0 5
## Female 0 1
## 3rd Male 35 13
## Female 17 14
Однако мне не нравится этот подход, потому что общая компоновка иногда меняется, если вы не будете осторожны. Сравните это со следующим, которое снимает требование поднабора только детей и добавляет подмножество только тех, кто не выжил:
ftable(as.table(mytable)[c("1st", "3rd"), , , "No"])
## Age Child Adult
## Class Sex
## 1st Male 0 118
## Female 0 4
## 3rd Male 35 387
## Female 17 89
Мне не нравится, что общее расположение строк и столбцов изменилось. Это классический случай необходимости помнить, чтобы использоватьdrop = FALSE
чтобы сохранить размеры при извлечении одного столбца:
ftable(as.table(mytable)[c("1st", "3rd"), , , "No", drop = FALSE])
## Survived No
## Class Sex Age
## 1st Male Child 0
## Adult 118
## Female Child 0
## Adult 4
## 3rd Male Child 35
## Adult 387
## Female Child 17
## Adult 89
Я знаю, что естьмного способы получения данных, которые я хочу, начиная с поднабора исходных данных и заканчиваяftable
, но для этого вопроса, давайте предположим, что это невозможно.
Конечная цель состоит в том, чтобы иметь подход, который позволяет мне извлечь изftable
сохранение формата отображения вложенной иерархии строк.
Есть ли другие решения для этого? Можем ли мы использоватьrow.vars
а такжеcol.vars
атрибуты для извлечения данных изftable
и сохранить его форматирование?
Мой текущий подход также не работает для иерархических столбцов, поэтому я надеюсь, что предлагаемое решение может также справиться с этими случаями.
Пример:
tab2 <- ftable(Titanic, row.vars = 1:2, col.vars = 3:4)
tab2
## Age Child Adult
## Survived No Yes No Yes
## Class Sex
## 1st Male 0 5 118 57
## Female 0 1 4 140
## 2nd Male 0 11 154 14
## Female 0 13 13 80
## 3rd Male 35 13 387 75
## Female 17 14 89 76
## Crew Male 0 0 670 192
## Female 0 0 3 20
Обратите внимание на вложенность "Age" и "Survived".
Попробуйте мой текущий подход:
ftable(as.table(tab2)[c("1st", "3rd"), , , , drop = FALSE])
## Survived No Yes
## Class Sex Age
## 1st Male Child 0 5
## Adult 118 57
## Female Child 0 1
## Adult 4 140
## 3rd Male Child 35 13
## Adult 387 75
## Female Child 17 14
## Adult 89 76
Я могу вернуться к тому, что я хочу с:
ftable(as.table(tab2)[c("1st", "3rd"), , , , drop = FALSE], row.vars = 1:2, col.vars = 3:4)
Но я надеюсь на что-то более прямое.