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

#r #categorical-data

#r #категориальный-данные

Вопрос:

Я пытаюсь создать код или найти в R, чтобы преобразовать мои категориальные данные, полученные из вопросника, в таблицу непредвиденных обстоятельств. Вот мой пример данных

 Age = sample(c("15--25", "26-35", "36-45", " "45"), 90, replace = TRUE)
Volunteering_yr = sample(c(‘1yr’, ‘2yr’, ‘3yr>’), 90, replace = TRUE)
Q1 = sample(c(‘A’,’B’,’C’,’D, ‘E’), 90, replace =TRUE)
Q2= sample(c(‘A’,’B’,’C’,’D, ‘E’), 90, replace =TRUE)
Q3 = sample(c(‘A’,’B’,’C’,’D, ‘E’), 90, replace =TRUE)
Q4 = sample(c(‘A’,’B’,’C’,’D, ‘E’), 90, replace =TRUE)
Q5 = sample(c(‘A’,’B’,’C’,’D, ‘E’), 90, replace =TRUE)
Db = data.frame(Age,Volunteering_yr , Q1, Q2, Q3, Q4, Q5) 
 

Я хотел бы, чтобы данные были реорганизованы либо по годам, либо по возрасту добровольцев, но сгруппированы по количеству ответов (например, A, B, C, D и E), что-то вроде этого

введите описание изображения здесь

Есть предложения? Большое спасибо

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

1. Где находятся столбцы Q? Что конкретно представляют числа в таблице?

2. Столбцы Q представляют вопросы, но они мне не нужны в моей окончательной таблице. Спасибо

Ответ №1:

Вы можете использовать xtabs функцию:

 xtabs(~Volunteering_yr   Q1,Db)
               Q1
Volunteering_yr  A  B  C  D  E
           1yr   6  7  3  6  7
           2yr   6  4  1  5  7
           3yr>  7  6  5  8 12
 

Я не знаю о простой базовой функции R для одновременного выполнения всех кварталов, но это было бы достаточно просто с tidyverse:

 library(tidyverse)
Db %>% 
  pivot_longer(-c(Age,Volunteering_yr)) %>% 
  group_by(Volunteering_yr, value) %>%
  tally() %>%
  pivot_wider(names_from = value, values_from = n)
## A tibble: 3 x 6
## Groups:   Volunteering_yr [3]
#  Volunteering_yr     A     B     C     D     E
#  <chr>           <int> <int> <int> <int> <int>
#1 1yr                33    33    25    26    28
#2 2yr                28    18    20    23    26
#3 3yr>               43    46    33    31    37
 

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

1. Привет, Ян, но это только для Q1, и я хочу получить сумму всех A за разные годы.

Ответ №2:

Попробуйте это. Я использовал пакет pacman для загрузки библиотек, но вы могли бы сделать их отдельно.

 Db <- data.frame(Age=sample(c("15-25","26-35","36-45"), 90, replace=T),
Volunteering_yr=sample(c("1yr","2yr","3yr"), 90, replace=T),
Q1 = sample(c("A","B","C","D","E"), 90, replace =TRUE),
Q2 = sample(c("A","B","C","D","E"), 90, replace =TRUE),
Q3 = sample(c("A","B","C","D","E"), 90, replace =TRUE),
Q4 = sample(c("A","B","C","D","E"), 90, replace =TRUE),
Q5 = sample(c("A","B","C","D","E"), 90, replace =TRUE))

pacman::p_load(dplyr, magrittr)
Db %<>% mutate(across(c("Age", "Volunteering_yr"), factor))

with(Db, table(Age, Volunteering_yr))
 
       Volunteering_yr
Age     1yr 2yr 3yr
  15-25   9  16   6
  26-35   9  13   8
  36-45  11   7  11