如何按映射规则替换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
相关产品推荐
相关产品推荐

