R语言编程:如何基于多列布尔值筛选并查找最高预算影片类型
问题描述
我有一个电影数据集,结构示例如下:
| Movie Name | Action | Thriller | Horror | MovieBudget |
|---|---|---|---|---|
| Movie1 | 0 | 1 | 1 | 2500000 |
| Movie2 | 1 | 0 | 0 | 3430000 |
| Movie3 | 1 | 0 | 1 | 1240000 |
需求是找出预算最高的影片,只保留该影片的基础信息(片名、预算等)和它实际所属的类型列(即值为1的类型列)。比如示例中预算最高的Movie2属于Action类型,输出如下:
| Movie Name | Movie Budget | Action |
|---|---|---|
| Movie2 | 3430000 | 1 |
由于数据集里有大量类型列,没法手动逐个指定,我尝试写了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
相关产品推荐
相关产品推荐

