R - 如何将带逗号分隔数的列更改为多个二进制值列

时间:2016-09-14 21:35:15

标签: r qualtrics

我正在处理来自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)

...但我无法弄清楚如何成功地将两个参数(类别和类别编号)传递给函数。

关于如何实现这一点的任何想法,要么使用我开始的功能还是完全不同的方式?

非常感谢!

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