上下文
在我的数据框中,我有一列,其中包含对餐馆消费替代品问题的固定回答。如果需要,受访者可以一次选择多个选项。
以下是此问题的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)
在这里的任何输入将不胜感激。
答案 0 :(得分: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)