如何用mutate(across)批量清理数据框多列的/和\字符
两种数据清理方法实现(基于dplyr)
先加载所需工具包:
library(dplyr) library(stringr)
原始数据框:
df <- structure(list(ID = c("Tom", "Jerry"), Subject1 = c("/Art", "/ELA"), Subject2 = c("\\Math", "/Math"), Subject3 = c("PE", "\\Bio\\2"), Subject4 = c(NA, "\\Music\\1")), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame"))
方法1:移除开头的\或/
使用mutate(across())指定处理所有以Subject开头的列,通过gsub匹配开头的\或/并替换为空字符串:
df_clean1 <- df %>% mutate(across(starts_with("Subject"), ~ gsub("^[\\\\/]", "", .x)))
输出结果:
> df_clean1 # A tibble: 2 × 5 ID Subject1 Subject2 Subject3 Subject4 <chr> <chr> <chr> <chr> <chr> 1 Tom Art Math PE NA 2 Jerry ELA Math Bio\\2 Music\\1
方法2:统一开头为\,并替换/为\
分两步处理:先将所有/替换为\,再给不以\开头的内容添加\:
df_clean2 <- df %>% mutate(across(starts_with("Subject"), ~ { # 替换所有/为\ temp <- gsub("/", "\\\\", .x) # 给非\开头的内容添加前缀\ str_replace(temp, "^([^\\\\].*)", "\\\\\\1") }))
输出结果:
> df_clean2 # A tibble: 2 × 5 ID Subject1 Subject2 Subject3 Subject4 <chr> <chr> <chr> <chr> <chr> 1 Tom \\Art \\Math \\PE NA 2 Jerry \\ELA \\Math \\Bio\\2 \\Music\\1
注:正则表达式中的\需要双重转义(写成\\\\),因为R字符串本身和正则引擎各需要一次转义。
内容的提问来源于stack exchange,提问作者Stataq
相关产品推荐
相关产品推荐

