Мы можем использовать cSplit_e
из splitstackshape
в R
library(splitstackshape)
cSplit_e(df1, "Category", type = "character", fill = 0, sep=",\\s*", fixed = FALSE)
# ID Category Num1 Num2 Num3 Category_A Category_B Category_C Category_D
#1 1 A, B, C 1 1 1 1 1 1 0
#2 2 B, C, D 1 0 1 0 1 1 1
#3 3 A, C 1 1 1 1 0 1 0
#4 4 A 0 1 1 1 0 0 0
#5 5 A, C, D 0 1 1 1 0 1 1
В base R
мы можем разделить столбец «Категория» на ,
и затем использовать table
cbind(df1, as.data.frame.matrix(table(stack(setNames(strsplit(df1$Category,
",\\s+"), df1$ID))[2:1])))
# ID Category Num1 Num2 Num3 A B C D
#1 1 A, B, C 1 1 1 1 1 1 0
#2 2 B, C, D 1 0 1 0 1 1 1
#3 3 A, C 1 1 1 1 0 1 0
#4 4 A 0 1 1 1 0 0 0
#5 5 A, C, D 0 1 1 1 0 1 1
Можно сделать еще более компактным с
library(qdapTools)
cbind(df1, mtabulate(strsplit(df1$Category, ",\\s+")))
# ID Category Num1 Num2 Num3 A B C D
#1 1 A, B, C 1 1 1 1 1 1 0
#2 2 B, C, D 1 0 1 0 1 1 1
#3 3 A, C 1 1 1 1 0 1 0
#4 4 A 0 1 1 1 0 0 0
#5 5 A, C, D 0 1 1 1 0 1 1
data
df1 <- structure(list(ID = 1:5, Category = c("A, B, C", "B, C, D", "A, C",
"A", "A, C, D"), Num1 = c(1L, 1L, 1L, 0L, 0L), Num2 = c(1L, 0L,
1L, 1L, 1L), Num3 = c(1L, 1L, 1L, 1L, 1L)), class = "data.frame", row.names = c(NA,
-5L))