来自变量的 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"