如何使用dplyr批量替换多变量中的-999为NA(含同类/异类变量)
批量替换数据框中的-999为NA
方法1:替换所有变量(tidyverse)
用dplyr的across()结合na_if()可以快速将所有列中的-999替换为NA,代码简洁直观:
library(dplyr) # 处理第一个数据框df df_clean <- df %>% mutate(across(everything(), na_if, y = -999)) # 处理第二个数据框df.2(所有变量替换) df.2_clean_all <- df.2 %>% mutate(across(everything(), na_if, y = -999))
across(everything())选中数据框的所有列,na_if()会自动将指定值(此处为-999)替换为NA。
方法2:替换指定变量(含模式匹配的变量)
如果仅需替换age、money.usd以及所有以cars.开头的变量,可结合列名匹配函数实现:
# 处理df.2,指定目标变量替换 df.2_clean_target <- df.2 %>% mutate(across(c(age, money.usd, starts_with("cars")), na_if, y = -999))
starts_with("cars")会匹配所有以cars开头的列(如cars.1、cars.2)- 若需更精准的正则匹配,可改用
matches("^cars\\."),仅匹配以cars.开头的列
方法3:Base R 实现
如果不使用tidyverse,Base R也能完成需求:
# 所有变量替换 df_clean_base <- df df_clean_base[df_clean_base == -999] <- NA # 指定变量替换 # 先筛选目标列名 target_vars <- c("age", "money.usd", grep("^cars\\.", names(df.2), value = TRUE)) df.2_clean_base <- df.2 df.2_clean_base[target_vars][df.2_clean_base[target_vars] == -999] <- NA
内容的提问来源于stack exchange,提问作者Shawn Hemelstrand
相关产品推荐
相关产品推荐

