按“|”拆分列

时间:2017-07-17 01:10:30

标签: r

我有一个带有“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

2 个答案:

答案 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