我有一个带有“genre”列的数据集,通常有多个类型由“|”分隔。例如:
Movie Genre
M1 Comedy|Drama
M2 Romance|Drama|Sci-fi
我想将这些类型分成二进制列,以便类型列变为多列,如下所示:
Movie Comedy Drama Romance Sci-fi
M1 1 1 0 0
M2 0 1 0 1
答案 0 :(得分:0)
您可以使用strsplit
拆分流派列,但请务必双重转义特殊字符" |"。例如:
dat <- data.frame(Movie = c("M1", "M2"),
Genre = c("Comedy|Drama", "Romance|Drama|Sci-fi"),
stringsAsFactors = FALSE)
genre_list <- strsplit(dat$Genre, split = "\\|")
unique_genres <- unique(unlist(genre_list, use.names = FALSE))
binary_genres <- t(sapply(genre_list, function(e) unique_genres %in% e))
mode(binary_genres) <- "integer"
colnames(binary_genres) <- unique_genres
out <- cbind(dat[1], binary_genres)
out
这将结果作为具有二进制响应变量的数据框
Movie Comedy Drama Romance Sci-fi
M1 1 1 0 0
M2 0 1 1 1
答案 1 :(得分:0)
您还可以使用separate_rows
包在|
和spread
数据框中尝试tidyr
:
library(tidyr)
df %>%
separate_rows(Genre, sep = "[|]") %>%
mutate(Value = 1) %>%
spread(Genre, Value) %>%
mutate_at(vars(2:5), funs(coalesce(., 0)))
这给出了:
Movie Comedy Drama Romance Sci-fi
1 M1 1 1 0 0
2 M2 0 1 1 1