R语言技术问询:移除无关行及筛选电影数据集评论数达标行
嘿,我来帮你搞定这两个问题,尤其是你提到的电影数据集筛选的小坑——之前结果只剩五星评分的电影,确实是因为那些只有1条评论的刚好全是五星,咱们一步步来解决:
1. R语言中移除无关行的通用方法
移除无关行的方式主要看你“无关”的定义,常见的几种场景:
- 按条件筛选保留行:用
dplyr::filter()(推荐,语法清晰)或者基础R的subset(),比如移除评分低于2的行:filter(df, rating >= 2) - 移除缺失值行:用
na.omit(df)或者dplyr::drop_na() - 按行索引移除:比如要删除第1、3行,用
df[-c(1,3), ]
2. 针对电影数据集筛选评论数≥10的行并计算平均评分
咱们先聚焦你的具体需求:先筛选出评论数至少10条的电影,再计算它们的平均评分,避免之前误保留单条五星评论电影的问题。
首先,假设你的数据集结构类似这样(模拟你提到的dput()样本):
# 模拟电影评论数据集的dput movie_ratings <- structure(list( movie_id = c(1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,4), rating = c(4,5,3,4,5,2,4,5,3,4,5,5,5,5,5,5) ), class = "data.frame", row.names = c(NA, -16L))
这个示例里:
- 电影1有10条评论(符合要求)
- 电影2/3/4的评论数都不足10,其中3、4全是五星评论(对应你之前遇到的情况)
方法一:用dplyr包(推荐,语法直观)
先确保安装并加载dplyr:
install.packages("dplyr") library(dplyr)
方式A:得到汇总结果(每个电影一行,含评论数+平均评分)
这是最直接的需求实现:
movie_summary <- movie_ratings %>% group_by(movie_id) %>% # 按电影分组 summarise( review_count = n(), # 统计每组的评论数 avg_rating = mean(rating) # 计算每组的平均评分 ) %>% filter(review_count >= 10) # 只保留评论数≥10的电影 # 查看结果,只有符合要求的电影1 print(movie_summary)
方式B:保留原始评论行(仅保留符合条件的电影的所有评论)
如果你需要后续对这些评论做更多分析,而不是直接汇总:
filtered_ratings <- movie_ratings %>% group_by(movie_id) %>% filter(n() >= 10) %>% # 过滤出组内评论数≥10的行 ungroup() # 取消分组,方便后续操作 # 查看结果,只有电影1的10条评论 print(filtered_ratings)
方法二:用基础R(不依赖第三方包)
如果你不想用dplyr,用基础R也能实现:
# 第一步:统计每个电影的评论数 review_counts <- aggregate(rating ~ movie_id, data = movie_ratings, FUN = length) colnames(review_counts)[2] <- "review_count" # 第二步:筛选出评论数≥10的电影ID valid_movie_ids <- review_counts[review_counts$review_count >= 10, "movie_id"] # 第三步:过滤原始数据集,只保留符合条件的电影评论 filtered_ratings_base <- movie_ratings[movie_ratings$movie_id %in% valid_movie_ids, ] # 第四步:计算这些电影的平均评分 avg_ratings_base <- aggregate(rating ~ movie_id, data = filtered_ratings_base, FUN = mean) colnames(avg_ratings_base)[2] <- "avg_rating" print(avg_ratings_base)
为什么之前会只剩五星评分的电影?
大概率是你之前的筛选逻辑搞反了——比如误保留了评论数≤1的电影,而这些电影刚好全是五星评论。用上面的分组过滤逻辑,就能精准锁定评论数达标的电影,避免这个问题。
内容的提问来源于stack exchange,提问作者bgg
相关产品推荐
相关产品推荐

