R - 多级变量到虚拟变量

时间:2017-02-07 14:02:37

标签: r matrix factors

我觉得这应该更容易。

假设我有一个包含“多值”项目的字段,例如电影类型。

我想把它们分解成假人,有多个项目的行在每个中都有一个假人。

我如何以一种漂亮,方便的方式做到这一点?

Bad R示例:

library(tidyverse)

data <- tribble(
  ~column,
  "var1",
  "var1 / var2",
  "var2",
  "var3",
  "var1 / var3",
  "var2 / var3"
)

data %>%
  separate(column, into = c("item1", "item2"), sep = " / ", fill = "right") %>%
  mutate_each(funs(factor(., levels = c("var1", "var2", "var3")))) %>%
  mutate(row = as.factor(row_number())) ->
  intermediate

head(intermediate)
#> # A tibble: 6 × 3
#>    item1  item2    row
#>   <fctr> <fctr> <fctr>
#> 1   var1     NA      1
#> 2   var1   var2      2
#> 3   var2     NA      3
#> 4   var3     NA      4
#> 5   var1   var3      5
#> 6   var2   var3      6

v1 <- xtabs( ~ row + item1, data = intermediate)
v2 <- xtabs( ~ row + item2, data = intermediate)

combined <- v1 + v2

combined
#>    item1
#> row var1 var2 var3
#>   1    1    0    0
#>   2    1    1    0
#>   3    0    1    0
#>   4    0    0    1
#>   5    1    0    1
#>   6    0    1    1

感觉真的不像R一样。

Python示例

使用sklearn的{​​{1}}在Python中很容易做到这一点。例如:

DictVectorizer

我真的只是想在R-land中寻找一个“整洁”的等价物。

1 个答案:

答案 0 :(得分:2)

您可以使用splitstackshape

  x<-c("var1",
       "var1 / var2",
       "var2",
       "var3",
       "var1 / var3",
       "var2 / var3"
  )

library(splitstackshape)

splitstackshape:::charMat(strsplit(x, " / "), 0)


     var1 var2 var3
[1,]    1    0    0
[2,]    1    1    0
[3,]    0    1    0
[4,]    0    0    1
[5,]    1    0    1
[6,]    0    1    1