使用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
答案 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)