2017-07-17 92 views
0

我有一個數據集與「流派」,通常有多個類型拆分「|」。例如:按「|」分割列

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

你想完成什麼語言? – user1357015

+0

這是一個兩步過程。首先[通過|拆分列](https://stackoverflow.com/questions/7069076/split-column-at-delimiter-in-data-frame),然後[將其轉換爲布爾矩陣](https:// stackoverflow.com/questions/22566592/convert-a-dataframe-to-presence-absence-matrix)。 –

+0

我想在R中完成 –

回答

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 
0

的數據幀還可以使用tidyr包嘗試separate_rows|spread數據幀:

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