如何创建一个对分类值进行分类并返回分类值的函数

时间:2019-02-23 20:34:26

标签: r function

我试图查看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 :(得分:0)

以下代码使用reshape2库和melt()方法将数据帧转换为所谓的熔融格式,该格式将流派作为列名重塑为流派,并将流派中的0或1标志重塑为行。然后plry库将它们汇总并返回所有年份的所有值,然后可以轻松地按感兴趣的年份对子集进行设置(或可以将其放入函数中以将年份作为参数传递)

库(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年,共有3部流派的58部电影被列出

  year n multi_genres_count
1 2000 3                 58