You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言编程:如何基于多列布尔值筛选并查找最高预算影片类型

问题描述

我有一个电影数据集,结构示例如下:

Movie NameActionThrillerHorrorMovieBudget
Movie10112500000
Movie21003430000
Movie31011240000

需求是找出预算最高的影片,只保留该影片的基础信息(片名、预算等)和它实际所属的类型列(即值为1的类型列)。比如示例中预算最高的Movie2属于Action类型,输出如下:

Movie NameMovie BudgetAction
Movie234300001

由于数据集里有大量类型列,没法手动逐个指定,我尝试写了R代码:

bool<- raw_data |> c(Crime!=0, Drama!=0, Western!=0, Biography!=0, History!=0, Adventure!=0, Fantasy!=0, Mystery!=0, SciFi!=0, Romance!=0, Thriller!=0, War!=0, Family!=0, Animation!=0, Comedy!=0)

raw_data |> slice_max(InflatedBudget) |> select(FilmName, Year, InflatedBudget, InflatedGross, raw_data[bool])

运行后报错:Error: object 'Crime' not found,我R经验不多,不知道怎么解决。

问题原因与解决方法

1. 报错原因

你写的Crime!=0这类代码没有绑定到raw_data数据集,R找不到单独的Crime对象,所以报错。另外c(...)的用法也无法正确筛选出目标类型列。

2. 分步解决代码

步骤1:筛选预算最高的影片行

top_budget_movie <- raw_data |> slice_max(InflatedBudget, n = 1)

n=1确保只取单条最高预算记录,若有并列第一,可调整n值或改用with_ties=TRUE保留所有并列行。

步骤2:筛选该影片所属的类型列

假设类型列都是仅含0和1的数值列,先区分类型列与非类型列:

# 提取所有类型列的列名
genre_cols <- colnames(top_budget_movie)[sapply(top_budget_movie, function(x) is.numeric(x) && all(x %in% c(0,1)))]
# 筛选当前影片值为1的类型列
selected_genres <- genre_cols[top_budget_movie[genre_cols] == 1]

步骤3:组合目标列并输出结果

result <- top_budget_movie |> select(FilmName, Year, InflatedBudget, InflatedGross, all_of(selected_genres))
print(result)

3. 整合版管道代码

如果想简化成单管道逻辑:

raw_data |>
  slice_max(InflatedBudget, n = 1) |>
  mutate(
    # 临时标记当前行值为1的类型列
    genre_flag = sapply(select(., where(function(x) is.numeric(x) && all(x %in% c(0,1)))), \(x) x == 1)
  ) |>
  select(FilmName, Year, InflatedBudget, InflatedGross, all_of(names(genre_flag)[genre_flag]))

4. 精准筛选类型列的补充技巧

如果你的类型列有统一命名规则(比如前缀为Genre_),可以直接用命名规则筛选,替代数值判断:

# 替换步骤2中的genre_cols筛选逻辑
genre_cols <- colnames(top_budget_movie)[startsWith(colnames(top_budget_movie), "Genre_")]

内容的提问来源于stack exchange,提问作者Rose Campos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 10:56:18