Реструктуризация опроса с множественными ответами - PullRequest
0 голосов
/ 14 сентября 2018

Часто данные из многократного ответа пунктов опроса структурированы без достаточной информации, чтобы упростить процесс уборки. В частности, у меня есть вопрос опроса, в котором респонденты выбирают один или несколько из 8 категорических пунктов. Результирующий кадр данных имеет от до 8 строк, разделенных запятыми. В некоторых ячейках может быть два, четыре или ни один из 8 вариантов, разделенных запятыми. Восьмой пункт - «Другое» и может быть заполнен пользовательским текстом.

Кстати, это типичный формат данных множественных ответов GoogleForms.

Ниже приведены примеры данных. Третья и последняя строки содержат уникальный ответ для восьмой «другой» опции:

structure(list(actvTypes = c(NA, NA, "Data collection, Results / findings /     learnings, ate ants and milkweed", 
NA, "Discussion of our research question, Planning for data collection", 
"Data analysis, Collected data, apples are yummy")), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

Я хотел бы создать набор из 8 новых столбцов, в которые ответы записываются как 0 или 1 . Как это можно сделать эффективно?

У меня есть решение, но оно громоздко. Я начал с создания новых столбцов для каждого из вариантов ответа:

atypes<-    c("atype1","atype2","atype3","atype4","atype5","atype6","atype7","atype8")
log[atypes]<-NA

Затем я написал восемь ifelse заявлений; формат для первых семи показан ниже:

log$atype7<-ifelse(str_detect(log$actvTypes,"Met with non-DASA team member (not data collection)"),1,0)

Для «другого» варианта ответа я использовал список строк и решение sapply:

alloptions<-c('Discussion of our research question' ,'Planning for data     collection' ,'Data analysis','Discussion of results | findings | learnings'     ,'Mid-course corrections to our project' ,'Collected data' ,'Met with non-DASA     team member (not data collection)' )
log$atype8<-sapply(log$actvTypes, function(x) 
    ifelse(
    any(sapply(alloptions, str_detect, string = x)==TRUE),1,0)   )

Как эта схема кодирования может быть более элегантной? Возможно sapply и с использованием индекса?

1 Ответ

0 голосов
/ 14 сентября 2018

В зависимости от того, что вы в конечном итоге пытаетесь сделать, может быть полезно следующее:

library(tidyverse)

df %>%
  rownames_to_column(var = "responder") %>%
  separate_rows(actvTypes, sep = ",") %>%
  mutate(actvTypes = fct_explicit_na(actvTypes)) %>%
  count(actvTypes)

# # A tibble: 9 x 2
#   actvTypes                                 n
#   <fct>                                 <int>
# 1 " apples are yummy"                       1
# 2 " ate ants and milkweed"                  1
# 3 " Collected data"                         1
# 4 " Planning for data collection"           1
# 5 " Results / findings /     learnings"     1
# 6 Data analysis                             1
# 7 Data collection                           1
# 8 Discussion of our research question       1
# 9 (Missing)                                 3

Обратите внимание на то, как это выглядит прямо перед вызовом count() - группировка "Другая категория должна быть тривиальной, если вы заранее знаете категории «не-другие».Вы также можете посмотреть, как это выглядит после вызова separate_rows().

...