объекты.

гда использую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)

Но я надеюсь на что-то более прямое.

Ответы на вопрос(2)

Ваш ответ на вопрос