Очистка данных опроса - пара похожих вопросов в каждом столбце - PullRequest
0 голосов
/ 05 мая 2018

У меня грязный набор данных (из опроса CATI). Я изо всех сил пытаюсь подготовить и привести его в порядок из-за файлов интервьюируемого / партнера / ребенка, разобраться с дублетом (парой похожих вопросов) в каждом столбце

Например, часть данных по полу выглядит следующим образом (1 = мужчина, 2 = женщина)

# A tibble: 7 x 7
  Household_size    q_1   q_2   q_3   q_4   q_5   q_6 
  <int>            <int> <int> <int> <int> <int> <int>
1 3                  1     2     1     NA   NA    NA
2 2                  2     1     NA    NA   NA    NA
3 5                  1     2     1     1    2     NA
4 3                  2     2     1     NA   NA    NA
5 6                  2     1     1     1    1     1
6 5                  1     2     1     2    2     NA
7 3                  1     2     2     NA   NA    NA

Метаданные говорят:

q_1 is  interviewee gender
q_2 is  interviewee - partner gender (if there is any)
q_3:q_6 interviewee - kid gender     (if there is any)

Данные имеют одинаковый формат для образования, профессии и т. Д. (Пара идентичных вопросов для интервьюируемого /partner/kid).

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

Male    15
Female  12

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Это просто, если вы поместите данные в длинный формат, отфильтровываете NA s, преобразует пол в фактор и подсчитываете количество. Я использую fct_recode из forcats (поставляется с tidyverse), но вы также можете изменить метки уровней факторов в базе R.

library(tidyverse)

df %>%
    gather(key = person, value = gender, -Household_size) %>%
    filter(!is.na(gender)) %>%
    mutate(gender_fct = as.factor(gender) %>% forcats::fct_recode("Male" = "1", "Female" = "2")) %>%
    count(gender_fct)
#> # A tibble: 2 x 2
#>   gender_fct     n
#>   <fct>      <int>
#> 1 Male          15
#> 2 Female        12

Создано в 2018-05-05 пакетом Представить (v0.2.0).

0 голосов
/ 05 мая 2018

Функция table в базе R может быть тем, что вы ищете, она дает вам универсальную опцию, которая считает все уровни:

table(unlist(df1[,c(2:7)]))

Измените это, чтобы имя фрейма данных (df1) и номера столбцов c(2,7) соответствовали вашим потребностям.

Это также повторяет ваш пример:

df1 <- data.frame("v" = LETTERS[1:7], "q1" = c(1,2,1,2,2,1,1), "q2" = c(2,1,2,2,1,2,2), "q3" = c(1,NA,1,1,1,1,2), "q4" = c(NA, NA,1,NA,1,2,NA), "q5" = c(NA, NA,2,NA,1,2,NA), "q6" = c(NA, NA,NA,NA,1,NA,NA))

> table(unlist(df1[,c(2:7)]))
 1  2 
15 12

Еще несколько примеров:

df1 <- data.frame("v" = LETTERS[1:5], "q1" = c(1,2,6,1,1), "q2" = c("k","k","f","h","p"), "q3" = c(1,2,NA,1,NA))

> df1
  v q1 q2 q3
1 A  1  k  1
2 B  2  k  2
3 C  6  f NA
4 D  1  h  1
5 E  1  p NA 

table(unlist(df1[,c(2,4)]))
table(unlist(df1[,3]))

> table(unlist(df1[,c(2,4)]))
1 2 6 
5 2 1 

> table(unlist(df1[,3]))
f h k p 
1 1 2 1
...