【问题标题】:R code to separate movie genres column from a dataset用于从数据集中分离电影流派列的 R 代码
【发布时间】:2021-09-24 14:30:43
【问题描述】:

所以我有一个 IMDB 电影数据集,其中有一列“流派”,其中有“|”分离的电影流派。前“犯罪|戏剧|恐怖”

现在每一行都有不同的流派组合,但我想将其分开,如果电影具有该流派,则分配 1,否则分配 0。

我编写了这段代码来获得我可以制作专栏的独特流派。

li = list()
for(x in movie_clean$genres) {
  tokens = tokenize_words(x)
  for(y in tokens)
    li = append(li, y)
}
li = li[!duplicated(li)]

我现在如何将 1 和 0 分配给主要流派列中的每个单独的列?

所以我希望最终输出是

| Adventure | Crime | Drama |

| 1         | 0     | 1     |

编辑:每一行都有不同数量的流派,例如: https://imgur.com/a/WRru4Qc

【问题讨论】:

  • 有一个名为separate的函数,但我需要一些数据来组合解决方案。

标签: r


【解决方案1】:

这里有一些选项 -

  1. tidyverse -
library(dplyr)
library(tidyr)

movie_clean %>%
  mutate(row = row_number()) %>%
  separate_rows(genres, sep = '\\|') %>%
  pivot_wider(names_from = genres, values_from = genres, 
              values_fn = function(x) 1, values_fill = 0) %>%
  select(-row)

#  Crime Drama Horror Action Adventure Fantasy Thriller
#  <dbl> <dbl>  <dbl>  <dbl>     <dbl>   <dbl>    <dbl>
#1     1     1      1      0         0       0        0
#2     0     0      0      1         1       1        0
#3     0     0      0      1         0       0        1

几个单行选项

  1. splitstackshape::cSplit_e
splitstackshape::cSplit_e(movie_clean, 'genres', sep = '|', type = 'character', fill = 0)
  1. qdapTools::mtabulate
qdapTools::mtabulate(strsplit(movie_clean$genres, '|', fixed = TRUE))

数据

如果您在reproducible format 中提供数据会更容易提供帮助

movie_clean <- data.frame(genres = c('Crime|Drama|Horror', 
                          'Action|Adventure|Fantasy', 'Action|Thriller'))

【讨论】:

  • 一个美妙的 tidyverse 解决方案。试图理解它的语法:为什么需要创建row(该变量在代码下方没有进一步显示,但没有它,代码将无法工作)?
  • 如果您在没有它的情况下以长格式获取数据 (movie_clean %&gt;% separate_rows(genres, sep = '\\|')),您会发现我们无法区分这些值。当我们获取宽格式数据(使用pivot_wider)时,我们不知道哪个流派来自哪一行,这会成为问题。因此,拥有row 列很重要,这样我们才能知道每个流派值的来源。
  • 这很有帮助,非常感谢!但是,pivot_wider“知道”rowsince 变量在任何地方都没有明确的地址?
【解决方案2】:

假设你有一个看起来像这样的向量

v <- c("Crime|Drama|Horror", "Apple|Banana|Orange", "Country|Rock|Rap")

然后使用tidyverse,你可以这样做:

data.frame(v) %>% separate(v, c("Col1", "Col2", "Col3"), sep = "[|]")

得到

     Col1   Col2   Col3
1   Crime  Drama Horror
2   Apple Banana Orange
3 Country   Rock    Rap

【讨论】:

  • 如果每行有 3 列,但每行有不同数量的类型,例如 row1:“犯罪|戏剧”row2:“动作”row3:“冒险|科幻|传记|战争》等
【解决方案3】:

base R 选项与read.table

 read.table(text = v, header = FALSE, sep = "|")
 V1     V2     V3
1   Crime  Drama Horror
2   Apple Banana Orange
3 Country   Rock    Rap

数据

v <- c("Crime|Drama|Horror", "Apple|Banana|Orange", "Country|Rock|Rap")

【讨论】:

  • 如果每行有 3 列,但每行有不同数量的类型,例如 row1:“犯罪|戏剧”row2:“动作”row3:“冒险|科幻|传记|战争》等
猜你喜欢
  • 2013-07-05
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 2019-11-18
相关资源
最近更新 更多