Как создать простую перекрестную таблицу для нескольких полей в R

#r #crosstab

#r #перекрестная таблица

Вопрос:

Я чувствую, что на это есть простой ответ, поскольку на этом форуме так много похожих вопросов, но по какой-то причине ни один из них, похоже, не применим.

У меня есть данные опроса вместе с назначениями сегментов, загруженными через Excel в R. Структура моих данных в основном такова (около 50 полей, включая назначение сегмента, для каждого из 330 респондентов):

ResponsentID Household.Size Children.in.household Сегмент
1 3 ДА Сегмент 1
2 2 НЕТ Сегмент 3
3 1 НЕТ Сегмент 2
4 2 НЕТ Сегмент 5
5 4 ДА Сегмент 1

Как вы видите выше, некоторые переменные являются числовыми, некоторые — категориальными. Я хочу создать простую перекрестную таблицу, не требующую статистического тестирования, которая суммирует каждое поле для каждого сегмента. Т.Е. Для каждого сегмента, какой% респондентов в этом сегменте имеют размер домохозяйства 1, 2, 3 и т.д.; у какого% есть дети в домохозяйстве и т.д.

Я экспериментировал как с перекрестной таблицей, так и с перекрестной таблицей (я понимаю, что последняя является просто оболочкой для первой), но я ничего не могу заставить работать. Большинство решений, размещенных на форумах, предназначены для отдельных полей, и я бы хотел избежать создания отдельных таблиц для каждого из 50 полей, если это возможно.

Пожалуйста, дайте мне знать, есть ли простой способ подойти к этому!

Комментарии:

1. Можете ли вы подробнее описать, как это будет выглядеть? Мне кажется, что они, естественно, должны быть отдельными таблицами, но, возможно, я не видел формат, о котором вы думаете.

2. @JonSpring Я предполагаю, что запрос был на автоматическую генерацию 50 таблиц.

3. Основываясь на перекрестных таблицах, которые мы получили от подрядчиков, я полагаю, что вы правы — для каждого поля будет отдельная таблица. Однако я бы предпочел не создавать отдельную таблицу для 50 полей — ie. у меня есть 50 строк кода, каждая из которых генерирует таблицу — если мне не нужно (хотя я бы согласился на это, если бы пришлось — я тоже не знаю, как это сделать).

4. @IRTFM точно — я надеялся, что есть функция, которая, по сути, говорит: «для каждого из этих полей создайте сводную таблицу, в которой строки — это значения полей, а столбцы — сегменты, а ячейки содержат% каждого сегмента, который соответствует каждому значению поля»

5. посмотрите tbl_summary из gtsummary пакета.

Ответ №1:

Используя данные, воспроизводимые в примечании в конце, и предполагая, что у нас есть небольшое количество сегментов (а именно. 5) и большим количеством переменных попробуйте table1 или аналогичные пакеты. (Сначала преобразуйте все столбцы в коэффициент, если вы хотите обрабатывать числовые столбцы как отдельные элементы.)

 library(table1)

tab1 <- table1(~ . | Segment, DF[-1])
as.data.frame(tab1)
 

предоставление:

                                 Segment 1         Segment 2         Segment 3         Segment 5           Overall
1                                   (N=2)             (N=1)             (N=1)             (N=1)             (N=5)
2        Household.Size                                                                                          
3             Mean (SD)      3.50 (0.707)         1.00 (NA)         2.00 (NA)         2.00 (NA)       2.40 (1.14)
4     Median [Min, Max] 3.50 [3.00, 4.00] 1.00 [1.00, 1.00] 2.00 [2.00, 2.00] 2.00 [2.00, 2.00] 2.00 [1.00, 4.00]
5 Children.in.household                                                                                          
6                   Yes          2 (100%)            0 (0%)            0 (0%)            0 (0%)         2 (40.0%)
7                    No            0 (0%)          1 (100%)          1 (100%)          1 (100%)         3 (60.0%)
 

Примечание

 DF <- 
structure(list(RespondentID = 1:5, Household.Size = c(3L, 2L, 
1L, 2L, 4L), Children.in.household = c("Yes", "No", "No", "No", 
"Yes"), Segment = c("Segment 1", "Segment 3", "Segment 2", "Segment 5", 
"Segment 1")), class = "data.frame", row.names = c(NA, -5L))
 

Комментарии:

1. Привет, большое спасибо за вашу помощь! Я не мог заставить вышеупомянутое решение работать, table1() требовал слишком много входных данных, и я продолжал сталкиваться с ошибками. Однако предложение @ George Savva о tbl_summary сделало именно то, что мне было нужно. У меня были небольшие проблемы с экспортом выходных данных, которые представляют собой большой файл, который нельзя принудительно преобразовать во фрейм данных, но я справился с этим, открыв результаты в новом окне и скопировав их в Excel. Спасибо!!

2. Вы должны попробовать все пакеты по ссылке в ответе, а не только пример пакета. Список в ссылке включает table1, gtsummary и многие другие пакеты.

Ответ №2:

Другим пакетом, который может подойти для этого, является janitor, затем функция tabyl в этом пакете:

https://garthtarr.github.io/meatR/janitor.html#tabyl ()