tidyverse 中跨多列的字符串替换

String substitutions across multiple columns in tidyverse

我的数据框

>df <- data.frame(Names = c("A", "B", "C"), Total = c("125", "2 500", "1 350"), 
>           Boys = c("50", "1 500", "350"),
>           Girls = c("75", "1 000", "1 000")) 
  Names Total  Boys Girls
1     A   125    50    75
2     B 2 500 1 500 1 000
3     C 1 350   350 1 000

所有值都是字符串。我想在 Total,Boys 和 Girls 中将空格“”替换为非空格“”。我知道

df %>%
  mutate(Total = gsub(" ", "", Total),
         Boys = gsub(" ", "", Boys),
         Girls = gsub(" ", "", Girls))

但是有没有更普遍的(tidyverse 风格)方法来做到这一点?像

df %>% # (This don't work)
  mutate(across(c(Total, Boys, Girls), gsub(" ", "", .x)))

即我正在寻找可扩展的解决方案。

提前致谢。

您可以使用:

library(dplyr)

df %>% mutate(across(c(Total, Boys, Girls), ~as.numeric(gsub(" ", "", .))))

#  Names Total Boys Girls
#1     A   125   50    75
#2     B  2500 1500  1000
#3     C  1350  350  1000

或在基数 R 中 lapply :

df[-1] <- lapply(df[-1], function(x) as.numeric(gsub(" ", "", x)))

我们可以使用 str_remove 来自 stringr

library(stringr)
library(dplyr)
df %>% 
    mutate(across(-Names, ~ as.numeric(str_remove(., "\s+"))))
#  Names Total Boys Girls
#1     A   125   50    75
#2     B  2500 1500  1000
#3     C  1350  350  1000

也许你可以像下面那样尝试 gsub + as.matrix

type.convert(cbind(df[1], gsub("\s+", "", as.matrix(df[-1]))), as.is = TRUE)

这给出了

  Names Total Boys Girls
1     A   125   50    75
2     B  2500 1500  1000
3     C  1350  350  1000