【问题标题】:R How to apply function to several subsetsR如何将功能应用于几个子集
【发布时间】:2014-04-29 22:04:31
【问题描述】:

我的数据集如下所示:

movie.id unknown Action Adventure rating 
1        0       0      0         3.831461 
2        0       1      1         3.416667 
3        0       0      0         3.945946
4        0       1      0         2.894737
5        1       0      0         4.358491

我想计算每种类型的平均评分。我可以手动对每个子集进行子集化,但我想更自动地完成它

update1:​​每部电影可以有多个流派,对于每个流派,如果电影属于流派,则值为 1,如果不是,则值为 0

update2:所以我想计算每部电影在冒险列中有 1 的收视率平均值,接下来是每部电影在动作列中有 1 分的电影,以及未知列(未知也是流派)等等

【问题讨论】:

  • 什么定义了“流派”?电影可以不止一种类型吗?电影 2 是动作冒险类型还是电影 2 是“动作冒险”类型?
  • 动作和冒险是两种类型,每部电影都属于不止一种类型
  • 或者没有流派? (上面的电影 1 和 3)?
  • 这种情况下可能是未知数,不知道有没有没有流派的电影。数据集中的类型比较多,我只是复制了一些,所以可能没有

标签: r apply subset


【解决方案1】:

使用reshape2 和dplyr 包:

首先安装它们:

> install.packages("reshape2")
> install.packages("dplyr")
> require(reshape2)
> require(dplyr)

然后:

> m
  id unknown Action Adventure     rating
1  1       0      0         0 0.51391395
2  2       0      1         1 0.02915435
3  3       0      0         0 0.88752693
4  4       0      1         0 0.57660751
5  5       1      0         0 0.59169393

然后它是一个单行:

> melt(m,measure=c("Action","Adventure","unknown")) %.% filter(value==1) %.% group_by(variable) %.% summarize(meanRating = mean(rating))
Source: local data frame [3 x 2]

   variable meanRating
1    Action 0.30288093
2 Adventure 0.02915435
3   unknown 0.59169393

只是为了检查,唯一重要的是:

> mean(m$rating[m$Action==1])
[1] 0.3028809

当您有很多流派时,将measure= 参数设置为流派列的名称。

更改变量的名称以获得更好的东西:

> melt(m,measure=c("Action","Adventure","unknown"),variable.name="genre") %.% filter(value==1) %.% group_by(genre) %.% summarize(meanRating = mean(rating))
Source: local data frame [3 x 2]

      genre meanRating
1    Action 0.30288093
2 Adventure 0.02915435
3   unknown 0.59169393

【讨论】:

  • 它看起来会产生我想要的输出,但我得到这个错误:错误:找不到函数“%.%”是什么意思?我该如何使用它?
【解决方案2】:

我相信这看起来也是有效的:

genres = names(DF)[2:4]
ret = lapply(genres, function(x) mean(DF[["rating"]][as.logical(DF[[x]])]))
cbind.data.frame(genres, means = unlist(ret)) #or whatever formating manipulation
#     genres    means
#1   unknown 4.358491
#2    Action 3.155702
#3 Adventure 3.416667

DF:

DF = structure(list(movie.id = 1:5, unknown = c(0L, 0L, 0L, 0L, 1L
), Action = c(0L, 1L, 0L, 1L, 0L), Adventure = c(0L, 1L, 0L, 
0L, 0L), rating = c(3.831461, 3.416667, 3.945946, 2.894737, 4.358491
)), .Names = c("movie.id", "unknown", "Action", "Adventure", 
"rating"), class = "data.frame", row.names = c(NA, -5L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2019-12-19
    • 1970-01-01
    • 2019-06-01
    相关资源
    最近更新 更多