我有来自谷歌表单的调查数据,其中包含“选择所有适用的”样式问题。 Google 表单将以“,”分隔的所有选定答案的单个字符串形式输出对此问题的响应。我想使用像
separate_longer_delim()
这样的东西将每个参与者所选的答案分开作为新行。最终,我打算使用 pivot_wider()
来旋转这些数据,以便每个唯一的响应都是一个新列,并且每个观察结果是 1 或 0,具体取决于参与者是否选择了该答案。
我遇到的主要问题是,一些调查回复的语言中包含“,”,使我无法使用整洁的类似分离的函数来沿着分隔符或正则表达式分隔字符串。
有没有办法通过输入问题的所有可能答案来完成此任务?或类似的规定?有没有办法识别参与者写下的“其他”回复?
这是我正在使用的一些数据的简化模型:
known_answers <-
c("I live alone",
"I live in on campus",
"I split housing costs with housemates, family, landlord, tenant, etc.",
"I have dependents",
"other")
set.seed(123)
data.frame(
ID = 1:10,
answer = replicate(n = 10, expr = (sample(x=known_answers, size = sample(1:3,1)))) %>% sapply(function(x) paste(x, collapse = ", "))
)
假设“其他”答案是写入答案的替代。在真实的调查数据中,如果参与者写入其他响应,则输出的字符串中不包含“其他”一词。
我希望数据类似于
separate_longer_delim()
(但我不能直接使用该函数,因为我没有可靠的分隔符):
ID answer
1 1 I split housing costs with housemates, family, landlord, tenant, etc.
1 1 I live in on campus
1 1 other
2 2 I live in on campus
2 2 other
3 3 other
3 3 I have dependents
3 3 I live in on campus
4 4 I live alone
4 4 I live in on campus
5 5 other
5 5 I split housing costs with housemates, family, landlord, tenant, etc.
5 5 I have dependents
6 6 I have dependents
7 7 I live alone
.
.
.
.
您可以构建一个辅助函数来转义已知术语。例如
escape_comma_terms <- function(x, terms) {
cleaned <- x
for (i in seq_along(terms)) {
cleaned <- gsub(terms[i], paste0("[[", i, "]]"), cleaned, fixed = TRUE)
}
cleaned
}
它将“我独自生活”之类的术语替换为“[[1]]”,因此不会出现逗号。然后您可以安全地拆分并重新合并回值中。
dd %>%
mutate(answer=escape_comma_terms(answer, known_answers)) %>%
tidyr::separate_longer_delim(answer, ", ") %>%
left_join(tibble(real_answer=known_answers, answer=paste0("[[", seq_along(known_answers), "]]")))
返回类似的东西
ID answer real_answer
1 1 [[3]] I split housing costs with housemates, family, landlord, tenant, etc.
2 1 [[2]] I live in on campus
3 1 [[5]] other
4 2 [[2]] I live in on campus
5 2 [[5]] other
6 3 [[5]] other