Часто данные из многократного ответа пунктов опроса структурированы без достаточной информации, чтобы упростить процесс уборки. В частности, у меня есть вопрос опроса, в котором респонденты выбирают один или несколько из 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
и с использованием индекса?