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

问题描述 投票:0回答:1

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

基本上,我有一个调查问卷数据集,目前处于一个参与者/行的水平。这些列包括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将数据集转换为长格式,但是我无法弄清楚如何将试用订单变量转换为有用的格式。下面是我真正可怕的尝试,实际上甚至没有返回正确的输出。即使这样做,也需要我首先手动指定每个问题名称,这对于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的普遍性,可能还有其他人)必须处理很多事情。

r data-cleaning qualtrics
1个回答
1
投票

我们可以使用

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+")))
© www.soinside.com 2019 - 2024. All rights reserved.