1

我正在尝试从数据集中提取电影类型的字符串。数据采用以下格式,其中流派类型由不同的评论者随机分布在数据集中。幸运的是,数据集中只有 4 种流派类型(喜剧、动作、恐怖、科幻),但也有重复。所以我需要从数据集中提取这些字符串。

id  movie v1      v2           v3       v4         v5     v6  
1   LTR   comedy  highbudget   action   comedy     jj     horror
2   MI    newmovie  fiction     scifi    funny      xx    jhee

我期待以下形式的输出。

id  movie   genretype1 genretype2 genretype3   genretype4
1   LTR     comedy     action     comedy       horror
2   MI      scifi      ---        ---          ---

有什么建议么?

4

2 回答 2

1

我就是这样做的——使用列表而不是 data.frame 更有意义

> types = c("comedy", "action", "horror", "scifi")
> List = apply(df, 1, function(x) types[types %in% x[-c(1, 2)]])
> names(List) <- df$movie
> List
$LTR
[1] "comedy" "action" "horror"

$MI
[1] "scifi"

或者,这个解决方案可以给你一个整洁的 data.frame:

> Matrix = t(apply(df, 1, function(x) types %in% x[-c(1, 2)]))
> colnames(Matrix) = types
> cbind(df[,1:2], Matrix)
  id movie comedy action horror scifi
1  1   LTR   TRUE   TRUE   TRUE FALSE
2  2    MI  FALSE  FALSE  FALSE  TRUE
于 2015-08-06T20:03:01.040 回答
1

我们可以match 使用“df1”的每一行的“类型”,不包括第一个两个标识符列。'lst1'中元素的长度list可能不同。我们通过将值填充NA到长度小于最大长度元素、rbind列表元素的元素来使长度相等,并创建一个新的data.frame.

 types <- c("comedy", "action", "horror", "scifi")
 lst1 <- apply(df1[-(1:2)], 1, function(x) 
                       types[match(x, types, nomatch=0)])
 res <- data.frame(df1[1:2], do.call(rbind, lapply(lst1, 
                             'length<-', max(lengths(lst1)))))
 res
 # id movie     X1     X2     X3     X4
 #1  1   LTR comedy action comedy horror
 #2  2    MI  scifi   <NA>   <NA>   <NA>

注意:如果需要,我们可以更改列名。

colnames(res)[-(1:2)] <- paste0('genretype', 1:4)
于 2015-08-11T20:07:10.700 回答