Как вернуть все возможные категории, разделенные | под одним столбцом - PullRequest
2 голосов
/ 14 апреля 2019

У меня есть набор данных "фильм", в котором есть столбец с именем "жанр", значения которого похожи на "Действие", "Действие | Анимация", "Анимация | Фэнтези".Фильм может иметь более одного жанра.Я хотел бы вывести список всех возможных отдельных категорий (таких как Adventure, Fantasy) и их частоты.Другими словами, я хочу знать, сколько фильмов имеют жанр «боевик», сколько фильмов «Фэнтези».Мне плевать на комбинации.Есть какой-нибудь совет по этому поводу?

Ответы [ 3 ]

0 голосов
/ 14 апреля 2019

Если цель состоит в том, чтобы найти частоту каждого жанра, тогда мы делаем split в столбце «жанр» в качестве разделителя | и используем mtabulate

library(qdapTools)
mtabulate(strsplit(as.character(df1$genre), "|", fixed = TRUE))

Или используя table из base R

dat <- stack(setNames(strsplit(as.character(df1$genre), "|", 
           fixed = TRUE), seq_len(nrow(df1))))
lvls <- c("Action', 'Adventure', 'Animation', 'Comedy', 'Fantasy')
dat$values <- factor(dat$values, levels = lvls)
table(dat[2:1])

ПРИМЕЧАНИЕ. Предполагая, что все категории находятся в наборе данных

0 голосов
/ 14 апреля 2019

Вот один простой способ сделать в базе R использование sapply

# sample data frame
df <- data.frame(genre=c("Action", "Action|Animation", "Animation|Fantasy"), stringsAsFactors = F)

# get uniq genre
uniq.genre <- unique(unlist(strsplit(df$genre, split = '\\|')))

# get frequency
sapply(uniq.genre, function(genre) {
  sum(grepl(genre, df$genre))
})
#>    Action Animation   Fantasy 
#>         2         2         1
0 голосов
/ 14 апреля 2019

Один из вариантов, если жанров не слишком много, - это использовать функцию grepl(), которая сообщит вам, если в символе появляется конкретная строка (например, 'Action') (например, 'Animation|Fantasy'):

library(dplyr)
library(stringr)

data.frame(
  genre = c('Action', 'Fantasy|Action', 'Animation|Fantasy')
) %>% 
  mutate(
    isAction    = grepl('Action', genre),
    isAdventure = grepl('Adventure', genre),
    isAnimation = grepl('Animation', genre),
    isComedy    = grepl('Comedy', genre),
    isFantasay  = grepl('Fantasy', genre)
  )

#               genre isAction isAdventure isAnimation isComedy isFantasay
# 1            Action     TRUE       FALSE       FALSE    FALSE      FALSE
# 2    Fantasy|Action     TRUE       FALSE       FALSE    FALSE       TRUE
# 3 Animation|Fantasy    FALSE       FALSE        TRUE    FALSE       TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...