R Кодирование категориальных переменных, соединенных разделителем

Контекст

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

Вот 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)

Любой вклад здесь будет принят с благодарностью.


person Varun    schedule 06.02.2019    source источник


Ответы (1)


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

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)
person Paweł Chabros    schedule 06.02.2019
comment
Отличный ответ. Просто для одного из значений ответа, содержащего несколько запятых, код разбивает его на разные части Buy from deli, bakery, coffee, or sandwich shop. - person Varun; 06.02.2019
comment
Во втором ответе - да. Я упомянул об этом. Но в первом решении это не так. - person Paweł Chabros; 06.02.2019