通常,来自多个响应调查项目的数据是结构化的,没有足够的信息使整理变得非常容易。具体来说,我有一个调查问题,受访者在其中选择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
并使用索引?
根据您最终要尝试执行的操作,以下内容可能会有所帮助:
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()
后的样子。