R gsub数和变量的空间

R gsub数和变量的空间,r,gsub,R,Gsub,使用gsub,我可以从这些person变量中删除#,但是我尝试删除随机数的方式是不正确的。我也想删除的空间后,人名,但保持空间在中间的名称。 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,

使用gsub,我可以从这些person变量中删除
#
,但是我尝试删除随机数的方式是不正确的。我也想删除的空间后,人名,但保持空间在中间的名称。
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
John johnson
jeff johnson

我们可以使用
paste

pat <- paste0("\\s*#(", paste(numbers, collapse = "|"), ")")
gsub(pat, "", person)
#[1] "mike smith"   "John johnson" "jeff johnson"

或者另一种选择是

unlist(strsplit(person, "\\s*#\\d+"))
注:以上均为
baser
方法



以下是另一种模式作为替代:

> gsub("(\\.*)\\s+#.*", "\\1", person)
[1] "mike smith"   "John johnson" "jeff johnson"
在上面的正则表达式中,
(\\.*)
将匹配空格(
\\s+
)前面的任何字符的子组,后跟
\
符号,后跟任何字符。然后
\\1
指示
gsub
应使用该子组
(\\\.*)

获得所需输出的更简单方法是:

> gsub("\\s+#.*$", "", person)
[1] "mike smith"   "John johnson" "jeff johnson"
上面的正则表达式
\\s+\\.*$
表示所有由空格(
\\s+
)、
\\
符号和字符串结尾(
\.$
)之前的所有内容都应该删除

使用
str\u从stringr包中提取所有

> 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)

我选择了gsub选项,因为这是我第一次看到它,谢谢你的其他答案。您能告诉我们您在上面一行中所指的参数是什么吗?我不确定您对“参数”的要求是什么,在每个函数调用中,参数都是显式写入的。(\\.\\s+\\.*和\\1是否需要捕获,因为这样会减慢速度。为什么不直接使用
sub(“\\s+#.*”,“”,person)
?不需要
gsub
sub
就足够了,在本例中,如果在模式中包含
$
,通常也可以检查答案
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"