Использование gsub в столбцах - PullRequest
       14

Использование gsub в столбцах

0 голосов
/ 18 сентября 2018

У меня есть некоторые данные:

testData <- tibble(fname = c("Alice", "Bob", "Charlie", "Dan", "Eric"), 
lname = c("Smith", "West", "CharlieBlack", "DanMcDowell", "Bush"))

Несколько фамилий имеют имена, объединенные с ними.

Какой эффективный способ пройти и исправить lnameстолбец?

Я хочу, чтобы это выглядело так:

lname = c("Smith", "West", "Black", "McDowell", "Bush")

Я могу использовать цикл for, но у меня есть полмиллиона строк данных, поэтому я хотел бы найтиболее эффективный метод.

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Мы можем использовать gsub в пределах apply:

apply(testData,1,function(x) gsub(x['fname'],"",x['lname']))

Выход:

[1] "Smith"    "West"     "Black"    "McDowell" "Bush"    
0 голосов
/ 18 сентября 2018

try mutate с предложением ifelse для захвата сцепленных lname объектов, например:

library(dplyr) testData <- testData %>% mutate(lname = ifelse(grepl('[[:upper:]][[:lower:]]+[[:upper:]]', lname), gsub('^[[:upper:]][[:lower:]]+', "", lname), lname))

В этом примере вы говорите "mutate"lname ЕСЛИ строка имеет заглавную букву + хотя бы одну строчную букву + заглавную букву. Если это условие выполнено, замените первую заглавную букву и следующие строчные буквы ничем. Если это условие не выполняется, просто сохраните оригиналlname текст ".

0 голосов
/ 18 сентября 2018

Мы можем использовать str_remove

library(tidyverse)
testData %>%
   mutate(lname = str_remove(lname, fname))
# A tibble: 5 x 2
#  fname   lname   
#  <chr>   <chr>   
#1 Alice   Smith   
#2 Bob     West    
#3 Charlie Black   
#4 Dan     McDowell
#5 Eric    Bush    
...