我正在处理来自Qualtrics的一些调查回复并分析R中的数据。一个问题,一个多答案多项选择问题,将逗号分隔的数字响应选项输出到一个单元格中。例如,选择选项4,7和10的人的输出看起来像" 4,7,10"或者" 10,4,7",R中的字符向量。由于某种原因,选择是随机顺序,具体取决于响应。
我能够使用splitstackshape包" cSplit"命令将所有这些值拆分为多个列。有22种可能的选择,因此单列(让我们称之为IM)被分成22个不同的列,每列包含一个值(例如IM_01,IM_02 ...... IM_22)。
对于上面给出的示例响应,出现为" 10,4,7",IM_01 = 10,IM_02 = 4,IM_03 = 7,IM_04到IM_22为NA。所以这里的问题是所有的4都不在一列中,也不是7或其他任何值。它们按照它们最初以逗号分隔形式出现的顺序排列在列中。
这是一个简化的小df作为我正在处理的例子。在这个例子中有七种可能的选择。
exampledf <- data.frame(ID = 1:3, Response = c("4,7,10", "7,5,16,8", "2,10"),
stringsAsFactors = FALSE)
ID Response
1 1 4,7,10
2 2 7,5,16,8
3 3 2,10
我想,对它们进行排序的一种好方法是为每个可能的选择创建一列,如果它与该行中的一个选项对应,则将该列中的单元格设置为1。预期的结果看起来像这样:
ID Response IM2 IM4 ... IM10 IM16
1 1 4,7,10 NA 1 1 NA
2 2 7,5,16,8 NA NA NA 1
3 3 2,10 1 NA 1 NA
现在我确实找到了使用以下代码对一列执行此操作的方法:
exampledf$IM4 <- NA
within(exampledf, IM4[IM_02 == 4 | IM_04 == 4 | IM_05 == 4
| IM_07 == 4 | IM_08 == 4 | IM_10 == 4
| IM_16 == 4 <- 1)
但我无法一次找到为所有列执行此操作的方法,而无需反复复制和粘贴代码,并将逻辑语句更改为等于每个复制块的相关选项。我也试过把它变成一个函数......
assignment <- function(cat, n) {
within(exampledf, cat[IM_02 == n | IM_04 == n | IM_05 == n
| IM_07 == n | IM_08 == n | IM_10 == n
| IM_16 == n <- 1)
...但我无法弄清楚如何成功地将两个参数(类别和类别编号)传递给函数。
关于如何实现这一点的任何想法,要么使用我开始的功能还是完全不同的方式?
非常感谢!
答案 0 :(得分:1)
在逗号上拆分响应向量:
exampledf$split_responses <- sapply(exampledf$Response,function(x) as.numeric(unlist(strsplit(x,','))))
将每个ID响应向量对组合成单独的数据帧,并按行逐行连接:
xx = do.call(rbind,apply(exampledf,1,function(x) data.frame(x$ID, x$split_responses)))
添加一列,列出您希望列的值:
xx$value = 1
并使用tidyr重塑成所需的形状:
library(tidyr)
spread(xx,key=x.split_responses,value=value)
x.ID 2 4 5 7 8 10 16
1 1 NA 1 NA 1 NA 1 NA
2 2 NA NA 1 1 1 NA 1
3 3 1 NA NA NA NA 1 NA