我觉得这应该更容易。
假设我有一个包含“多值”项目的字段,例如电影类型。
我想把它们分解成假人,有多个项目的行在每个中都有一个假人。
我如何以一种漂亮,方便的方式做到这一点?
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一样。
使用sklearn
的{{1}}在Python中很容易做到这一点。例如:
DictVectorizer
我真的只是想在R-land中寻找一个“整洁”的等价物。
答案 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