首页 > 解决方案 > 如何在 R 中拆分变量?

问题描述

我有以下数据框,其中包含单行的多个值

小标题:1,751 x 1 值

1 2 3 5
2 2 4
3 2
4 1 2 3 4

...还有 1,741 行

这种结构的原因是我有一个在线问卷,它接受同一个问题的多个答案(1,2,3,4,5,6 对应答案,每行是一个受访者),但数据的存储方式是一个问题,因为如果不事先操作数据框,就无法显示所有堆叠的答案。

不幸的是,我不知道如何以每行包含一个值的方式操作数据框。或者,将答案分成不同的列也很有用。任何帮助将非常感激。

标签: rsplitstringr

解决方案


将您的 tibble 对象视为 df,

在每一行中创建一个元素向量:

newdf <- strsplit(df$x, " ")

将列表中的向量转换为数值:

newdf <- lapply(newdf, as.numeric)

查找列表中的最大值:

cl <- max(unlist(lapply(newdf, max)))

为每个响应创建一个包含列的空矩阵:

out <- matrix(nrow = nrow(df), ncol = cl)

根据响应中相应数字的出现填充响应列:

for (i in 1:length(newdf)) {
  out[i,] <- 1:cl %in% newdf[[i]]
}

使用选项编号重命名列:

colnames(out) <- paste("Opt", 1:cl, sep = "_")

将矩阵转换为小标题:

out <- tibble::as.tibble(out)

最后的小标题:

out
# A tibble: 4 x 5
  Opt_1 Opt_2 Opt_3 Opt_4 Opt_5
  <lgl> <lgl> <lgl> <lgl> <lgl>
1 FALSE TRUE  TRUE  FALSE TRUE 
2 FALSE TRUE  FALSE TRUE  FALSE
3 FALSE TRUE  FALSE FALSE FALSE
4 TRUE  TRUE  TRUE  TRUE  FALSE
  

编辑:

如果你确定选项的数量(这里是 6),你可以有

cl <- 6

如果您不希望有 true 或 false,您可以运行它。值 1 表示选择了相应的选项。

out <- as.data.frame(out)
for (i in colnames(out)) {
  out[,i] <- as.integer(out[,i])
  }

  Opt_1 Opt_2 Opt_3 Opt_4 Opt_5
1     0     1     1     0     1
2     0     1     0     1     0
3     0     1     0     0     0
4     1     1     1     1     0

如果您想使用选项编号而不是 0 和 1:

out <- as.data.frame(out)
for (i in 1:ncol(out)) {
  out[,i] <- as.integer(out[,i])*i
}



  Opt_1 Opt_2 Opt_3 Opt_4 Opt_5
1     0     2     3     0     5
2     0     2     0     4     0
3     0     2     0     0     0
4     1     2     3     4     0

推荐阅读