将字符串转换为 R 数据框中的指示器/虚拟列

问题描述 投票:0回答:1

我有一项调查数据,其中有多种选择。因此,在一个单元格中,您有多个答案,并用列分隔。有很多问题,大多数都有很长的字符串答案。我想将单元格分成几列,其中变量名称是答案,值是 1 或 0,具体取决于答案是否包含它。

下面是一个简单问题的示例,具有非常简单的字符串和所需的结果。

data <- data.frame("v1" = c(c("apple, orange"),c("apple, melon"),c("banana")))

result <- data.frame("apple" = c(1,1,0),
                   "orange" = c(1,0,0),
                   "melon" = c(0,1,0),
                   "banana" = c(0,0,1))

我想整个过程应该是这样的:

  • 对于每个变量/问题都有多个答案
  • 查找并存储数据中的唯一值
  • 用这些名称创建新向量
  • 字符串搜索每个单元格内的每个变量名称,如果找到则标记为 1/0

这是我不完整的尝试,仅针对一个变量

a <- strsplit(input$v1, split = ", ")
b <- # missing step 
c <- unique(b)
c <- c("apple","orange","melon","banana") # manually for now
d <- as.character(unlist(c))
e <- data.frame(matrix(ncol = length(c), nrow = nrow(input)))
colnames(e) <- d
f <- cbind(input,e)
for (Variable in c) {
  for (Value in d) {
    input$Variable <- ifelse(grepl(Value,input$v1, fixed = TRUE),1,0)
  }
}
input$v1 <- NULL

有什么建议吗?

r
1个回答
1
投票
library(qdapTools)
library(dplyr)

data |>
  mutate(v1 = strsplit(v1, ", ")) |>
  (\(x) mtabulate(x[["v1"]]))()
#   apple banana melon orange
# 1     1      0     0      1
# 2     1      0     1      0
# 3     0      1     0      0
© www.soinside.com 2019 - 2024. All rights reserved.