Подстрока R с условиями

#r

#r

Вопрос:

У МЕНЯ ЕСТЬ ФРЕЙМ ДАННЫХ-R

 first <- c("robbin", "Santa", "beta", "tom" )
Last <-  c("greek", "alpha", "gamma", "angel")
Primaryphone <- c("9988776655","(123)456","(789)6543210","88")
Cellphone <- c("7896000001","1234567890","8877665","7654")
df<-data.frame(first,Last,Primaryphone,Cellphone)
  

Я пытаюсь воспроизвести следующий вывод:

Взяв первые две буквы фамилии

рассматривайте только телефонные номера с 10 цифрами, если они не должны содержать 10 цифр, их следует игнорировать

последние 4 цифры основного телефона, последние 4 цифры мобильного телефона, если в этих столбцах было 10 символов

 Output
gr66550001
al7890
ga3210
  

Комментарии:

1. Действительно, почему вы откатываете кучу изменений, которые сделали вопрос намного проще для чтения?

2. @RonakShah, у него было (789)6543210 в основном столбце телефона, имеет 10 символов, а у мобильного телефона меньше 10 символов, поэтому он должен считываться только из Primaryphonecolumn

Ответ №1:

Вы можете попробовать следующее :

 library(dplyr)

df %>%
  #Replace opening, closing round brackets (())
  mutate(across(c(Primaryphone, Cellphone), ~ gsub('[()]', '', .)), 
         #Change value to blank if less than 10 characters
         across(c(Primaryphone, Cellphone), ~ replace(., nchar(.) != 10, '')))  %>%
  #Keep only those rows which have 10 characters in Primaryphone or Cellphone
  filter(nchar(Primaryphone) == 10 | nchar(Cellphone) == 10) %>%
  #Paste the output using substring
  mutate(output = paste0(substring(Last, 1, 2), 
                         substring(Primaryphone, nchar(Primaryphone) - 3), 
                         substring(Cellphone, nchar(Cellphone) - 3)))

#   First  Last Primaryphone  Cellphone     output
#1 robbin greek   9988776655 7896000001 gr66550001
#2  Santa alpha              1234567890     al7890
#3   beta gamma   7896543210                ga3210
  

Комментарии:

1. Спасибо, что все разобрано

2. Ваши решения всегда являются хорошим источником обучения для меня @Ronak.

3. @Ronak Shah, когда я пытаюсь заменить код своими данными, он отображает выходные данные как ZH7527NA, поскольку он добавляет NA, если есть пробел

4. @Ronak Shah, когда я пытаюсь заменить код своими данными, он отображает выходные данные как ZH7527NA, поскольку он добавляет NA, если есть пробел

5. @Perry Вы также можете заменить NA на пробел. Изменение в этой части. replace(., nchar(.) != 10 | is.na(.), '')