Как создать функцию, которая классифицирует и возвращает классифицированные значения - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь посмотреть data(movies), которые находятся в library(ggplot2movies), и я пытаюсь подсчитать общее количество фильмов в random-year, которые классифицированы по n жанрам.

Например, если n=2, это означает, что я считаю те фильмы, которые классифицированы в двух жанрах.Фильм X может быть комедией и романом.Тогда этот фильм X будет подсчитан с использованием этой функции ниже.

Например, я мог бы посмотреть на:

movies_released_2000 = data.frame(movies$year==2000)

То, что я сделал, было:

nums_movies <- function(input_df, n) {
 counts = lapply(input_df,rowSums)
 if (counts == n){
break}
}

В надежде вернуть:

nums_movies(movies_released_2000[18:24],3)
# [1] 5 # five movies released in 2000 were classified into three genres at the same time

Я использовал lapply для вычисления суммы строк каждого фильма, а затем возвращал только тех, чья сумма строки равна n.

Но это вызывает у меня проблему с

Error in FUN(X[[i]], ...) : 
  'x' must be an array of at least two dimensions 

. Я рассчитывал рассчитать общее количество фильмов, которые были классифицированы по n количеству жанров.Например, если я введу nums_movies(movies_released_2000[18:24],3), получится целое число, которое подсчитывает, сколько фильмов, выпущенных в 2000 году, было классифицировано в трех разных жанрах (например, это могут быть фильмы, классифицированные как «Комедия», «Романтика», «Триллер»).,

1 Ответ

0 голосов
/ 23 февраля 2019

В следующем коде используются библиотека reshape2 и метод melt (), чтобы преобразовать фрейм данных в так называемый расплавленный формат, который преобразует жанры как имена столбцов в жанры как строки вместе с флагом 0 или 1 нахождения в жанре.,Затем библиотека plry агрегирует их и возвращает все значения за все годы, которые затем легко устанавливаются под интересующим годом (или могут быть вставлены в функцию для передачи года в качестве аргумента)

library (ggplot2movies)) библиотека (reshape2) библиотека (plyr)

data(movies)

movies <- movies[,c("year","Action","Animation","Comedy","Drama","Documentary","Romance","Short")]

movies <- melt(movies,"year",variable.name="genre",value.name="in_genre")
movies_by_genre_year <- ddply(movies,.(year,genre),summarise,total=sum(in_genre))

movies_by_genre_year[movies_by_genre_year$year==2000,]

Таким образом, для примера 2000 года, следующие жанры учитывают следующее количество фильмов:

    year       genre total
750 2000      Action   154
751 2000   Animation    89
752 2000      Comedy   561
753 2000       Drama   793
754 2000 Documentary   175
755 2000     Romance   207
756 2000       Short   449

За комментарий, дополнительныйответ с использованием базы R

data(movies)
movies <- as.data.frame(movies[,c("year","Action","Animation","Comedy","Drama","Documentary","Romance","Short")])
year <- 2000
movies<-lapply(movies[movies$year==year,c(2:7)],sum)
data.frame(year=year,m)

Обновление, показывающее количество фильмов, подсчитанных в количестве n-указанных жанров:

data(movies)
movies <- as.data.frame(movies[,c("year","Action","Animation","Comedy","Drama","Documentary","Romance","Short")])
year <- 2000
n <- 3
matches <- apply(movies[movies$year==year,c(2:7)],1,function(x) { sum(x)==n })
data.frame(year=year,n=n,multi_genres_count=sum(matches))

Здесь, в 2000 году, 58 фильмов были перечислены в 3 разных жанрах

  year n multi_genres_count
1 2000 3                 58
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...