1

データ セットから映画タイプの文字列を抽出しようとしています。データは次の形式で、さまざまなレビュアーによってジャンル タイプがデータセットにランダムに分散されています。幸い、データセットには 4 つのジャンル タイプ (コメディ、アクション、ホラー、SF) しかありませんが、繰り返しもあります。したがって、データセットからこれらの文字列を抽出する必要があります。

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 最初の 2 つの識別子列を除いて、「df1」の各行で「型」を指定できます。list「lst1」の要素の長さは同じではない可能性があります。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 に答える