R gsub数和变量空间

时间:2018-10-01 16:07:26

标签: r gsub

使用gsub可以从这些人员变量中删除#,但是我尝试删除随机数的方法不正确。我也想删除人员姓名后的空格,但将空格保留在姓名中间。

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

5 个答案:

答案 0 :(得分:1)

以下是另一种模式:

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

答案 1 :(得分:1)

c('mike smith #99','John johnson #2','jeff johnson #50') -> person
sub("\\s+#.*", "", person)
[1] "mike smith"   "John johnson" "jeff johnson"

答案 2 :(得分:0)

我们可以使用paste

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

请注意,上述解决方案基于创建带有“数字”的模式。如果只是要删除#后面的数字

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)

答案 3 :(得分:0)

也可以使用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

答案 4 :(得分:0)

一种替代方法,它删除字符串末尾的任何非(小写)字母字符序列。

gsub("[^a-z]+$", "", person)
[1] "mike smith"   "John johnson" "jeff johnson"

如果要允许全部为大写或以大写字符结尾的单词。

gsub("[^a-zA-Z]+$", "", person)

某些名称可能以.结尾:

gsub("[^a-zA-Z.]+$", "", person)