【问题标题】:Faster way to creating a binary vector of fixed length: if fixed length is say 6, 4' would become (0,0,0,1,0,0)创建固定长度二进制向量的更快方法:如果固定长度为 6,则 4' 将变为 (0,0,0,1,0,0)
【发布时间】:2019-10-08 07:24:05
【问题描述】:

我有大量关于多项选择题的调查答案数据。每行代表一个人对大约 73 个问题的回答。每列代表一个问题的答案:例如,如果他们回答 (d),他们得到 4。我想将每个观察值 (行、列) 转换为 1 和 0 的向量,因此 (d) 将变为 (0,0 ,0,1)。

我一直在创建 2 个逻辑 for 循环。但它需要很多时间。

有人知道更快/更智能/更有效的方法吗?

【问题讨论】:

  • 你能举一个你的数据框的例子并展示预期的输出吗?
  • 我添加了一张图片!

标签: r vector binary


【解决方案1】:

我正在使用简单的示例数据:

df <- data.frame(answers = c(1,2,5,4,3,2,6,1,4))

  answers
1       1
2       2
3       5
4       4
5       3
6       2
7       6
8       1
9       4

然后创建空向量

df$recode <- list(rep(0, 6))

  answers           recode
1       1 0, 0, 0, 0, 0, 0
2       2 0, 0, 0, 0, 0, 0
3       5 0, 0, 0, 0, 0, 0
4       4 0, 0, 0, 0, 0, 0
5       3 0, 0, 0, 0, 0, 0
6       2 0, 0, 0, 0, 0, 0
7       6 0, 0, 0, 0, 0, 0
8       1 0, 0, 0, 0, 0, 0
9       4 0, 0, 0, 0, 0, 0

然后根据你答案中的信息来操作它们。

df$recode <- Map(function(x,y) `[<-`(x,y,1), x = df$recode, y = df$answers)

  answers           recode
1       1 1, 0, 0, 0, 0, 0
2       2 0, 1, 0, 0, 0, 0
3       5 0, 0, 0, 0, 1, 0
4       4 0, 0, 0, 1, 0, 0
5       3 0, 0, 1, 0, 0, 0
6       2 0, 1, 0, 0, 0, 0
7       6 0, 0, 0, 0, 0, 1
8       1 1, 0, 0, 0, 0, 0
9       4 0, 0, 0, 1, 0, 0

【讨论】:

  • 我尝试过这样的事情。我的数据框需要 20 多分钟 :(
  • 对我来说,它在 0.04 秒内完成 20k 行。
  • 问题是,每个答案都有不同数量的可能答案。它不是每个问题都不变..
  • 好吧,那么你必须为每次更改 list(rep(0, *number of possible answers*)) 的每个答案重复此操作。
  • 还有一个问题。刚刚意识到有些人根本没有回答 = 所以他们的答案被记录为 0。在这种情况下,我希望向量只是 0。任何想法我该如何处理?非常感激!更新:我认为将 [[&lt;- 更改为 [&lt;- 已修复!
【解决方案2】:

sjmisc 包中的 to_dummy 可以完成这项工作。

library(sjmisc)
df1=data.frame(Q1=c(1,2,3,4),Q2=c(2,2,3,4))
to_dummy(df1)

如您所见,它只为 Q2 创建了 3 个变量,这很不幸(它只有 3 个模态)。因此,只有在每个问题都存在所有模式时,这才有效。

一个快速的技巧是将四行添加到您的 DATA 中(一个通过模态),然后删除它们。

df2=rbind(df1,rep(1,ncol(df1)),rep(2,ncol(df1)),rep(3,ncol(df1)),rep(4,ncol(df1)))

to_dummy(df2)[1:(nrow(df2)-4),]

【讨论】:

  • 我不明白为什么它会改变我的答案。
  • 我想我不完全理解 rep() 部分
  • rbind :您将添加行; rep(1,ncol(df1),您将添加一个仅由 1 组成的行,它是您的数据框 (ncol(df1)) 的大小。然后这些行在最后被删除。这是为了确保所有模式都是表示转换为 dummy 时。试试 rep(1,10)
  • 哦,不,我了解这些功能是如何工作的,但不确定如何将其实现到 50,000 x 70 数据集
猜你喜欢
  • 2011-03-16
  • 2012-08-26
  • 1970-01-01
  • 2011-02-16
  • 2014-12-15
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多