根据 r 中 var 的值生成所有可能的虚拟对象

Generate all posible dummies according values of var in r

我有一个这样的数据框:

df <- data.frame(V1=c("a,b,c,d,e,f","a,b,c","e,f","b,d","a,e"))

我想根据 var V1 中的类别生成所有可能的虚拟对象,如下所示:

df$a <- c(1,1,0,0,1)
df$b <- c(1,1,0,1,0)
df$c <- c(1,1,0,0,0)
df$d <- c(1,0,0,1,0)
df$e <- c(1,0,1,0,1)
df$f <- c(1,0,1,0,0)

> df
           V1 a b c d e f
1 a,b,c,d,e,f 1 1 1 1 1 1
2       a,b,c 1 1 1 0 0 0
3         e,f 0 0 0 0 1 1
4         b,d 0 1 0 1 0 0
5         a,e 1 0 0 0 1 0

我怎样才能有效地做到这一点?我有一个大数据框,V1 有很多类别。

这是一个解决方案,它使用 strsplit() 拆分字符串并使用 dcast() 从长格式重塑为宽格式:

library(data.table)
setDT(df)[, rn := .I][
  , strsplit(as.character(V1), ","), by = rn][
    , dcast(.SD, rn ~ V1, length)]
   rn a b c d e f
1:  1 1 1 1 1 1 1
2:  2 1 1 1 0 0 0
3:  3 0 0 0 0 1 1
4:  4 0 1 0 1 0 0
5:  5 1 0 0 0 1 0

如果要包含V1,可以在后面加入:

library(data.table) # version 1.11.4 used
setDT(df)[, rn := .I][
  , strsplit(as.character(V1), ","), by = rn][
    , dcast(.SD, rn ~ V1, length)][
      df, on = "rn"][
        , setcolorder(.SD, "V1")]
            V1 rn a b c d e f
1: a,b,c,d,e,f  1 1 1 1 1 1 1
2:       a,b,c  2 1 1 1 0 0 0
3:         e,f  3 0 0 0 0 1 1
4:         b,d  4 0 1 0 1 0 0
5:         a,e  5 1 0 0 0 1 0

setcolorder()用于将V1列移到前面。

一个选项是使用 splitstackshape::cSplit 拆分 V1 列。确保使用 drop = FALSE 以便保留 V1 列。现在,使用 tidyr::gather 转换为长格式,然后 reshape2::dcast 将数据转换为宽格式。

library(tidyverse)
library(splitstackshape)
library(reshape2)

df %>% cSplit("V1", drop = FALSE, type.convert = FALSE) %>%
  gather(key, value, -V1) %>%
  filter(!is.na(value)) %>%
  dcast(V1~value, fun.aggregate = length)

#            V1 a b c d e f
# 1       a,b,c 1 1 1 0 0 0
# 2 a,b,c,d,e,f 1 1 1 1 1 1
# 3         a,e 1 0 0 0 1 0
# 4         b,d 0 1 0 1 0 0
# 5         e,f 0 0 0 0 1 1  

数据:

df <- data.frame(V1=c("a,b,c,d,e,f","a,b,c","e,f","b,d","a,e"), stringsAsFactors = FALSE)