R Кодирование категориальных переменных, соединенных разделителем - PullRequest
0 голосов
/ 06 февраля 2019

Контекст

В моем кадре данных есть столбец, содержащий фиксированные ответы на вопрос об альтернативах потреблению в ресторане.Респонденты могут выбрать несколько вариантов сразу, если это необходимо.

Вот 9 уникальных вариантов ответов, доступных респондентам для этого вопроса -

#Unique responses to question
unique_vector = c('Bring food from home',
                  'Buy from a supermarket',
                  'Buy from deli, bakery, coffee, or sandwich shop',
                  'Go home',
                  'Go out to a fast food outlet',
                  'Order food from outside',
                  'Snack between meals',
                  'Go out to a full service restaurant',
                  'Skip the meal')

После проведения опроса на10 респондентов, итоговый фрейм данных выглядит следующим образом -

#Survey Dataframe
df= data.frame(
                          Id = c(1:10),

                          QUESTION=c(unique_vector[1],
                          paste0(unique_vector[1],',',unique_vector[2]),
                          paste0(unique_vector[1],',',unique_vector[2],',',unique_vector[2]),
                          paste0(unique_vector[4],',',unique_vector[5],',',unique_vector[1]),
                          paste0(unique_vector[3],',',unique_vector[1],',',unique_vector[9],',',unique_vector[7]),
                          paste0(unique_vector[5],',',unique_vector[6],',',unique_vector[8],',',unique_vector[1]),
                          unique_vector[3],
                          "",
                          paste0(unique_vector[5],',',unique_vector[6],',',unique_vector[8],',',unique_vector[1]),
                          "")
)

Моя цель

Я хотел бы расширить столбец QUESTION так, чтобы каждыйуникальный ответ - это отдельный столбец в кадре данных.

И затем я бы хотел кодировать эти ответы так, чтобы они записывались как 1 с (а не как 0).

Моя попытка

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

#Attempt
library(onehot)
encoded_df = onehot(df[,2], stringsAsFactors=TRUE)

Будем благодарны за любые вводимые данные.

1 Ответ

0 голосов
/ 06 февраля 2019

Я скорее сомневаюсь, что это самый простой способ сделать это, но результат верен:

library(tidyverse)

unique_vector %>%
  str_c(collapse = ')|(') %>%
  str_c('(', ., ')') %>%
  str_extract_all(df$QUESTION, ., simplify = TRUE) %>%
  as.data.frame() %>%
  as_tibble() %>%
  mutate(Id = row_number()) %>%
  gather(x, key, V1:V4) %>%
  mutate(val = 1) %>%
  spread(key, val, fill = 0) %>%
  select(-c(x, V1)) %>%
  group_by(Id) %>%
  summarise_all(~if_else(sum(.) > 0, 1, 0))

Если разделитель будет отличаться от , (, также встречается в ответах), он будетПроще сделать, разделив этот разделитель:

df %>%
  as_tibble() %>%
  mutate(QUESTION = map(QUESTION, ~str_split(.x, ',')[[1]] %>% unique)) %>%
  unnest() %>%
  mutate(val = 1) %>%
  spread(QUESTION, val, fill = 0) %>%
  select(-V1)
...