R gsub числа и пробел из переменных - PullRequest
0 голосов
/ 01 октября 2018

С помощью 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 голосов
/ 07 октября 2018
c('mike smith #99','John johnson #2','jeff johnson #50') -> person
sub("\\s+#.*", "", person)
[1] "mike smith"   "John johnson" "jeff johnson"
0 голосов
/ 01 октября 2018

Альтернатива, которая удаляет любую последовательность нестрочных (строчных) буквенных символов в конце строки.

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

Если вы хотите разрешить слова, которые являются заглавными или заканчиваются заглавными буквами.

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

Некоторые имена могут заканчиваться .:

gsub("[^a-zA-Z.]+$", "", person)
0 голосов
/ 01 октября 2018

Вот еще один шаблон в качестве альтернативы:

> 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 из пакета 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)
0 голосов
/ 01 октября 2018

Это можно сделать поочередно с 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
0 голосов
/ 01 октября 2018

Мы можем создать шаблон с помощью 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)
...