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
我的数据框
>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