如何用dplyr的mutate()和across()按条件修改指定前缀列值
解决R语言数据框按条件修改列值的问题
你的代码问题分析
across()语法错误:正确调用格式是across(列选择器, 处理函数),你把括号拆分导致逻辑错误replace()参数错误:replace的第一个参数应该是要修改的向量(即当前列),且你用了字符串"NA",这不是R的缺失值类型,要改用原生NA- 条件判断错误:
'bNA' == "1"是字符串字面量比较,没有引用数据框的bNA列,且原始数据中bNA是数值型,应该用bNA == 1
正确实现代码
先构造原始数据(和你给出的一致),再执行处理:
library(dplyr) # 构造原始数据 df <- tibble( a1 = c(1,1,1), a2 = c(1,1,1), a3 = c(1,1,1), aNA = c(0,1,0), b1 = c(1,1,1), b2 = c(1,1,1), b3 = c(1,1,1), bNA = c(0,0,1) ) # 核心处理代码 df_processed <- df %>% mutate(across(starts_with("b"), ~ifelse(bNA == 1, NA, .x))) # 查看结果 print(df_processed)
代码解释
across(starts_with("b")):选中所有以b开头的列(包括b1、b2、b3、bNA)ifelse(bNA == 1, NA, .x):对每一列的每个元素做判断,若该行bNA值为1,则替换为NA,否则保留原数值.x
输出结果
# A tibble: 3 × 8 a1 a2 a3 aNA b1 b2 b3 bNA <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 1 1 1 0 1 1 1 0 2 1 1 1 1 1 1 1 0 3 1 1 1 0 NA NA NA 1
替代写法(用replace函数)
如果偏好replace,也可以这样写:
df %>% mutate(across(starts_with("b"), ~replace(.x, bNA == 1, NA)))
内容的提问来源于stack exchange,提问作者hexaruz
相关产品推荐
相关产品推荐

