转换宽数据集中的列,该列是一串串联的问题名称,以便将它们询问为长数据集中的试验编号

Converting a column in a wide dataset which is a string of concatenated question names in order they were asked into trial number in a long dataset

我正在处理一个非常烦人的数据清理问题,我似乎找不到解决的好方法。它来自 Qualtrics 记录调查问题顺序的方式,当这些问题可以随机排列时。

基本上,我有一个调查回复数据集,目前处于 participant/row 级别。这些列包括 id(参与者 id),问题 1 到 3 的 3 列,然后是问题出现顺序的列,这是一个字符串,用于每个参与者的问题顺序,每个问题用竖线分隔.使问题复杂化的是问题名称不是非常一致,并且其中有很多随机标点符号等 - 我试图在下面的示例中复制最常见的奇怪之处(问题中间的随机下划线,不一致的排序的问题等)。下面的 rawData 数据框显示了一个大致数据的示例——实际上我有几百个参与者和几十个问题。

我想将数据集设置为参与者问题级别,其中一个数字列用于参与者,一个字符列用于他们正在回答的问题,还有一个数字列用于试验问题(即做了他们首先看到它,然后再看到它?)。下面的数据框 finalDataSnippet 显示了我希望它最终看起来的样子。

rawData = data.frame(id = 1:3, question_1c = c(2,3,4), question_2 = c(4,5,6), ques_tion_3 = c(3,2,4), 'trialOrder' = c("question_1c|question_2|ques_tion_3", "question_2|question_3|ques_tion_1c", "question_3|question_2|ques_tion_1c"))

finalDataSnippet = data.frame(id = c(rep(1,3),rep(2,3), rep(3,3)), question = rep(1:3,3), value = c(2,4,3,3,5,2,4,6,4), trialNumber = c(1,2,3,3,1,2,3,2,1))

我知道如何使用 tidyr 和 pivot_longer 将数据集转换为长格式,但我不知道如何将试用订单变量转换为有用的格式。下面是我真正糟糕的尝试,实际上 return 甚至没有正确的输出。即使这样做,也需要我先手动指定每个问题的名称,这对于 60 多个问题来说并不是真的可行。 (此外,嵌套的 for 循环和不断使用 c() 确实看起来效率很低)

checks = c("1", "2", "3")
numberParticipants = 3
results = NA

for(item in 1:length(checks)){
  for(i in 1:numberParticipants){
    results = c(results, Position(function(x) grepl(checks[item],x), trial_orders[[i]]))
  }
}

如果您能提供任何帮助,我将不胜感激——我(可能还有其他人,考虑到 Qualtrics 的普遍性)必须经常处理这个问题。

我们可以使用

library(dplyr)
library(tidyr)
library(stringr)
rawData %>% 
  select(-trialOrder) %>%
  pivot_longer(cols = starts_with('ques'), names_to = 'question') %>% 
  mutate(question = readr::parse_number(question)) %>% 
  mutate(trialNumber = unlist(str_extract_all(rawData$trialOrder, "\d+")))

也可以

rawData %>% 
    select(-trialOrder) %>%
    pivot_longer(cols = starts_with('ques'), names_to = 'question') %>% 
    mutate(question = readr::parse_number(question)) %>% 
    mutate(trialNumber = unlist(str_extract_all(rawData$trialOrder, "\d+")))