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

如何按映射规则替换DataFrame指定行中的所有值?

问题:对指定行按映射规则重编码tibble数据

原始tibble数据定义:

df <- tibble(question = 1:3, a = c('chicken', 'apple', 'beer'), b = c('chicken', 'banana', 'beer'), c = c('beef', 'apple', 'wine'))

原始数据预览:

question a       b       c    
>      <int> <chr>   <chr>   <chr>
1        1 chicken chicken beef 
2        2 apple   banana  apple
3        3 beer    beer    wine 

需求:按照apple -> 1、banana -> 2的映射规则,替换第2行的所有对应值,期望结果:

question a       b       c    
>      <int> <chr>   <chr>   <chr>
1        1 chicken chicken beef 
2        2       1       2        1
3        3 beer    beer    wine 

遇到的困惑:试过case_match但它只适用于向量,想通过across()对指定行的所有列应用规则,但不知道怎么组合实现;且需求不是替换特定行列索引的值,而是对整行按映射规则重编码。


解决方案

方法1:用recode结合across实现

这种方式适合预定义映射规则的场景,代码更简洁:

library(dplyr)

# 定义映射规则
map_rules <- c(apple = "1", banana = "2")

df_processed <- df %>%
  mutate(across(c(a, b, c), ~ if_else(question == 2, recode(., !!!map_rules), .)))
  • across(c(a, b, c))指定要处理的列;
  • if_else(question == 2, ..., .)判断是否是目标行,是则执行替换,否则保留原值;
  • !!!map_rules把映射列表展开,传递给recode作为参数。

方法2:用case_match结合across实现

如果更习惯case_match的匹配写法,可以用这个方案:

library(dplyr)

df_processed <- df %>%
  mutate(across(c(a, b, c), ~ if_else(question == 2, 
                                      case_match(., 
                                                 "apple" ~ "1", 
                                                 "banana" ~ "2", 
                                                 .default = .), 
                                      .)))
  • case_match里通过.default = .指定不匹配映射规则的值保留原样;
  • 同样通过if_else限定只对目标行(question == 2)应用规则。

两种方法都是基于行的条件(而非硬编码行索引)来应用映射规则,符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:00:59