R、正则表达式和匹配 Qualtrics 响应列的选择
R, Regex, and Matching the Choice of a Qualtrics Response Column
当您将 Qualtrics 中的回复数据导出为 CSV 格式时,数据的第二行包含带有问题主干的字符串(必要时缩短),后跟破折号,然后是该回复列的相应选项。例如,如果我的问题是 "Please select all of the fruit you enjoy:",在我的响应数据中,该问题的响应列的第二行可能包含类似 "Please select all of the fruit you enjoy:-Blueberries" 的内容。
Qualtrics 会缩短超过 100 个字符的问题词干。如果超过 100 个字符,则在第 99 个字符后截断词干,附加“...”,然后是破折号,然后是选择文本。
我正在尝试检索此破折号之后的文本。然而,这很难,因为选择文本和问题文本都可能包含破折号。我想到了两种不同的方法来尝试 select 仅选择文本:
我有问题文本,并且可以根据响应列名称以编程方式可靠地检索它。但是,问题文本并不总是完全匹配,因为 Qualtrics 会删除响应数据中问题文本中的任何 HTML 样式,但不会删除我从中获取问题文本的 Qualtrics 调查文件中的样式。对于没有任何 HTML 样式的问题,我正在考虑尝试使用问题文本以某种方式匹配并包括问题文本和选择文本之间的破折号。我认为正则表达式可以很好地处理这种情况,但是如果没有对任何具有 HTML 组件的问题进行大量修改,这显然是行不通的。
我认为这个替代方案可能更可靠。从 QSF 文件中去除任何 HTML 标签的问题文本,然后计算问题文本中出现了多少个“-”字符。调用 n
,然后匹配第 n+1
个破折号的第 2 行响应条目,将其删除,剩下的就是我的选择文本。
我认为第二个选项更有可能始终如一地工作,因为第一个选项让我不得不尝试以与 Qualtrics 完全相同的方式从问题文本中删除 html ,除非我使用模糊匹配(我对此一无所知)。但是,我也不清楚第二种选择。
例如,第一个问题的问题文本在 QSF 中如下所示:
"<div style=\"text-align: center;\">Click to write the question text
<span style=\"font-size: 10.8333px;\">thsi<sup>tasdf<em>werasfd</em></sup>
<em>sdfad</em></span><br />\n </div>"
我将不胜感激以下两项:关于您认为最有可能成功的选项(或对另一个选项的建议)的建议,以及帮助 R 中的正则表达式将文本匹配到 n+1
th "-" 字符。
这是计算问题中破折号的解决方案,找到文本中的第 n 个破折号(如果有的话)并删除前面的字符,然后保留文本中下一个破折号之后的子字符串。
stem_text <- "Please--select your extracurriculars"
s <- "<em>Please</em>--select your extracurriculars-student-athletics"
# count dashes in question stem
stem_dash_n <- length(gregexpr("-", stem_text)[[1]])
# locate dashes in string
s_dashes <- gregexpr("-", s)[[1]]
sub_start <- ifelse(length(s_dashes), s_dashes[stem_dash_n], 1)
s_sub <- substr(s, sub_start + 1, nchar(s))
sub("[^\-]*\-(.*)", "\1", s_sub, perl = TRUE)
# [1] "student-athletics"
假设:根据您的描述,length(s_dashes) >= stem_dash_n
,所以s_dashes[stem_dash_n]
存在;相同数量的破折号出现在已知词干及其在文本中的表示中;并且总有一个破折号将词干和响应选项分开。
当您将 Qualtrics 中的回复数据导出为 CSV 格式时,数据的第二行包含带有问题主干的字符串(必要时缩短),后跟破折号,然后是该回复列的相应选项。例如,如果我的问题是 "Please select all of the fruit you enjoy:",在我的响应数据中,该问题的响应列的第二行可能包含类似 "Please select all of the fruit you enjoy:-Blueberries" 的内容。
Qualtrics 会缩短超过 100 个字符的问题词干。如果超过 100 个字符,则在第 99 个字符后截断词干,附加“...”,然后是破折号,然后是选择文本。
我正在尝试检索此破折号之后的文本。然而,这很难,因为选择文本和问题文本都可能包含破折号。我想到了两种不同的方法来尝试 select 仅选择文本:
我有问题文本,并且可以根据响应列名称以编程方式可靠地检索它。但是,问题文本并不总是完全匹配,因为 Qualtrics 会删除响应数据中问题文本中的任何 HTML 样式,但不会删除我从中获取问题文本的 Qualtrics 调查文件中的样式。对于没有任何 HTML 样式的问题,我正在考虑尝试使用问题文本以某种方式匹配并包括问题文本和选择文本之间的破折号。我认为正则表达式可以很好地处理这种情况,但是如果没有对任何具有 HTML 组件的问题进行大量修改,这显然是行不通的。
我认为这个替代方案可能更可靠。从 QSF 文件中去除任何 HTML 标签的问题文本,然后计算问题文本中出现了多少个“-”字符。调用
n
,然后匹配第n+1
个破折号的第 2 行响应条目,将其删除,剩下的就是我的选择文本。
我认为第二个选项更有可能始终如一地工作,因为第一个选项让我不得不尝试以与 Qualtrics 完全相同的方式从问题文本中删除 html ,除非我使用模糊匹配(我对此一无所知)。但是,我也不清楚第二种选择。
例如,第一个问题的问题文本在 QSF 中如下所示:
"<div style=\"text-align: center;\">Click to write the question text
<span style=\"font-size: 10.8333px;\">thsi<sup>tasdf<em>werasfd</em></sup>
<em>sdfad</em></span><br />\n </div>"
我将不胜感激以下两项:关于您认为最有可能成功的选项(或对另一个选项的建议)的建议,以及帮助 R 中的正则表达式将文本匹配到 n+1
th "-" 字符。
这是计算问题中破折号的解决方案,找到文本中的第 n 个破折号(如果有的话)并删除前面的字符,然后保留文本中下一个破折号之后的子字符串。
stem_text <- "Please--select your extracurriculars"
s <- "<em>Please</em>--select your extracurriculars-student-athletics"
# count dashes in question stem
stem_dash_n <- length(gregexpr("-", stem_text)[[1]])
# locate dashes in string
s_dashes <- gregexpr("-", s)[[1]]
sub_start <- ifelse(length(s_dashes), s_dashes[stem_dash_n], 1)
s_sub <- substr(s, sub_start + 1, nchar(s))
sub("[^\-]*\-(.*)", "\1", s_sub, perl = TRUE)
# [1] "student-athletics"
假设:根据您的描述,length(s_dashes) >= stem_dash_n
,所以s_dashes[stem_dash_n]
存在;相同数量的破折号出现在已知词干及其在文本中的表示中;并且总有一个破折号将词干和响应选项分开。