Определите набор строк и удалите их из столбца. - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь перебрать столбец и удалить все символы в начале строки, которые подпадают под мой предопределенный набор строк.

Воспроизводимый пример

df <- data.frame(serial = 1:3, name = c("Javier", "Kenneth", "Kasey"))

  serial    name
1      1  Javier
2      2 Kenneth
3      3   Kasey

Вектор состояния Удаляет эти строки только из передней части имени!

vec <- c("Ja", "Ka")

Предполагаемый выход

  serial    name
1      1    vier
2      2 Kenneth
3      3     sey

Ответы [ 3 ]

4 голосов
/ 23 апреля 2019

Мы могли бы создать шаблон, вставив vec в один вектор и удалить их вхождение, используя sub.

df$name <- sub(paste0("^", vec, collapse = "|"), "", df$name)

df
#  serial    name
#1      1    vier
#2      2 Kenneth
#3      3     sey

В stringr мы также можем использовать str_remove

stringr::str_remove(df$name, paste0("^", vec, collapse = "|"))
#[1] "vier"    "Kenneth" "sey" 
3 голосов
/ 23 апреля 2019

Поскольку в этом примере мы используем строки vec фиксированной длины, может быть даже более эффективно использовать substr замены. Это действительно окупится только в том случае, если df и / или vec велико, и достигается ценой некоторой гибкости.

df$name <- as.character(df$name)
sel <- substr(df$name, 1, 2) %in% vec
df$name[sel] <- substr(df$name, 3, nchar(df$name))[sel]

#  serial    name
#1      1    vier
#2      2 Kenneth
#3      3     sey
2 голосов
/ 23 апреля 2019

Мы также можем сделать это с substring

library(stringr)
library(dplyr)
df$name <- substring(df$name, replace_na(str_locate(df$name, 
               paste(vec, collapse="|"))[,2] + 1, 1))
df$name
#[1] "vier"    "Kenneth" "sey"   

Или с str_replace

str_replace(df$name, paste0("^", vec,  collapse="|"), "")
#[1] "vier"    "Kenneth" "sey"    

Или с использованием gsubfn

library(gsubfn)
gsubfn("^.{2}", setNames(rep(list(""), length(vec)), vec), as.character(df$name))
#[1] "vier"    "Kenneth" "sey"    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...