来自变量的 R gsub 数字和 space
R gsub numbers and space from variables
使用 gsub 我可以从这些人变量中删除 #
,但是我尝试删除随机数的方式不正确。我还想删除人名后的 space,但保留名字中间的 space。
c('mike smith #99','John johnson #2','jeff johnson #50') -> person
c(1:99) -> numbers
person <- gsub("#", "", person, fixed=TRUE)
# MY ISSUE
person <- gsub(numbers, "", person, fixed=TRUE)
df <- data.frame(PERSON = person)
当前结果:
PERSON
mike smith 99
John johnson 2
jeff johnson 50
预期结果:
PERSON
mike smith
John johnson
jeff johnson
我们可以用 paste
创建模式
pat <- paste0("\s*#(", paste(numbers, collapse = "|"), ")")
gsub(pat, "", person)
#[1] "mike smith" "John johnson" "jeff johnson"
请注意,上述解决方案基于使用 'numbers' 创建模式。如果只是去掉#
后面的数字包括
sub("\s*#\d+$", "", person)
#[1] "mike smith" "John johnson" "jeff johnson"
或者另一种选择是
unlist(strsplit(person, "\s*#\d+"))
注意:以上都是base R
方法
library(tidyverse)
data_frame(person) %>%
separate(person, into = c("person", "notneeded"), "\s+#") %>%
select(person)
这里有另一种模式可供选择:
> gsub("(\.*)\s+#.*", "\1", person)
[1] "mike smith" "John johnson" "jeff johnson"
在上面的正则表达式中,(\.*)
将匹配 space (\s+
) 之前的任何字符的子组,然后是 #
符号和任何内容。然后 \1
表示 gsub
应该用那个子组替换所有原始字符串 (\.*)
获得所需输出的更简单方法是:
> gsub("\s+#.*$", "", person)
[1] "mike smith" "John johnson" "jeff johnson"
上面的正则表达式 \s+#.*$
表示由 space (\s+
)、#
符号和其他所有内容组成,直到字符串结尾 (\.$
) 应该被删除。
使用来自 stringr 包的 str_extract_all
> library(stringr)
> str_extract_all(person, "[[a-z]]+", simplify = TRUE)
[,1] [,2]
[1,] "mike" "smith"
[2,] "ohn" "johnson"
[3,] "jeff" "johnson"
您还可以使用:
library(stringi)
stri_extract_all(person, regex="[[a-z]]+", simplify=TRUE)
这也可以用 read.table
来完成。
read.table(text = person, sep = "#", strip.white = TRUE,
as.is = TRUE, col.names = "PERSON")
给予:
PERSON
1 mike smith
2 John johnson
3 jeff johnson
删除字符串末尾任何非(小写)字母字符序列的替代方法。
gsub("[^a-z]+$", "", person)
[1] "mike smith" "John johnson" "jeff johnson"
如果您想要允许全部大写或以大写字符结尾的单词。
gsub("[^a-zA-Z]+$", "", person)
有些名字可能以 .
:
结尾
gsub("[^a-zA-Z.]+$", "", person)
c('mike smith #99','John johnson #2','jeff johnson #50') -> person
sub("\s+#.*", "", person)
[1] "mike smith" "John johnson" "jeff johnson"
使用 gsub 我可以从这些人变量中删除 #
,但是我尝试删除随机数的方式不正确。我还想删除人名后的 space,但保留名字中间的 space。
c('mike smith #99','John johnson #2','jeff johnson #50') -> person
c(1:99) -> numbers
person <- gsub("#", "", person, fixed=TRUE)
# MY ISSUE
person <- gsub(numbers, "", person, fixed=TRUE)
df <- data.frame(PERSON = person)
当前结果:
PERSON
mike smith 99
John johnson 2
jeff johnson 50
预期结果:
PERSON
mike smith
John johnson
jeff johnson
我们可以用 paste
pat <- paste0("\s*#(", paste(numbers, collapse = "|"), ")")
gsub(pat, "", person)
#[1] "mike smith" "John johnson" "jeff johnson"
请注意,上述解决方案基于使用 'numbers' 创建模式。如果只是去掉#
后面的数字包括
sub("\s*#\d+$", "", person)
#[1] "mike smith" "John johnson" "jeff johnson"
或者另一种选择是
unlist(strsplit(person, "\s*#\d+"))
注意:以上都是base R
方法
library(tidyverse)
data_frame(person) %>%
separate(person, into = c("person", "notneeded"), "\s+#") %>%
select(person)
这里有另一种模式可供选择:
> gsub("(\.*)\s+#.*", "\1", person)
[1] "mike smith" "John johnson" "jeff johnson"
在上面的正则表达式中,(\.*)
将匹配 space (\s+
) 之前的任何字符的子组,然后是 #
符号和任何内容。然后 \1
表示 gsub
应该用那个子组替换所有原始字符串 (\.*)
获得所需输出的更简单方法是:
> gsub("\s+#.*$", "", person)
[1] "mike smith" "John johnson" "jeff johnson"
上面的正则表达式 \s+#.*$
表示由 space (\s+
)、#
符号和其他所有内容组成,直到字符串结尾 (\.$
) 应该被删除。
使用来自 stringr 包的 str_extract_all
> library(stringr)
> str_extract_all(person, "[[a-z]]+", simplify = TRUE)
[,1] [,2]
[1,] "mike" "smith"
[2,] "ohn" "johnson"
[3,] "jeff" "johnson"
您还可以使用:
library(stringi)
stri_extract_all(person, regex="[[a-z]]+", simplify=TRUE)
这也可以用 read.table
来完成。
read.table(text = person, sep = "#", strip.white = TRUE,
as.is = TRUE, col.names = "PERSON")
给予:
PERSON
1 mike smith
2 John johnson
3 jeff johnson
删除字符串末尾任何非(小写)字母字符序列的替代方法。
gsub("[^a-z]+$", "", person)
[1] "mike smith" "John johnson" "jeff johnson"
如果您想要允许全部大写或以大写字符结尾的单词。
gsub("[^a-zA-Z]+$", "", person)
有些名字可能以 .
:
gsub("[^a-zA-Z.]+$", "", person)
c('mike smith #99','John johnson #2','jeff johnson #50') -> person
sub("\s+#.*", "", person)
[1] "mike smith" "John johnson" "jeff johnson"