Отдельные строки на строке и сохранение оригинала - PullRequest
1 голос
/ 05 апреля 2020

Я работаю над проектом, в котором я хочу все перестановки указанных строк c. Я использую tidyr::separate_rows для разделения и дублирования указанной строки c, но я хочу сохранить исходную строку.

require(dplyr)
require(tidyr)
temp <- tibble(raw_name = c("happy bank dba american bank and trust", " sohappy bank dba american bank"), clean_name = c("american bank and trust", "american bank"))

Итак, вот что я делаю сейчас:

final <- temp %>%
    separate_rows(raw_name, sep = "dba") 

Что потеряло мои исходные строки. Я посмотрел документацию, но нет версии .keep_all = TRUE, которую я могу найти. Вот результат описанного выше separate_rows:

  raw_name                               clean_name             
  <chr>                                  <chr>                  
1 happy bank dba american bank and trust american bank and trust
2 " sohappy bank dba american bank"      american bank          

Мое текущее решение - создать новый df с ошибочными наблюдениями, выполнить separate_rows и rbind исходных строк. Вот мой желаемый результат:

raw_name                               clean_name             
  <chr>                                  <chr>                  
1 happy bank dba american bank and trust american bank and trust
2 " sohappy bank dba american bank"      american bank          
3 "happy bank "                          american bank and trust
4 " american bank and trust"             american bank and trust
5 " sohappy bank "                       american bank          
6 " american bank"                       american bank          

Спасибо всем!

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

После разделения строк мы можем связать с исходным набором данных

library(dplyr)
library(tidyr)
temp %>% 
  separate_rows(raw_name, sep="\\s*dba\\s*") %>%
  bind_rows(temp, .)
# A tibble: 6 x 2
#  raw_name                                 clean_name             
#* <chr>                                    <chr>                  
#1 "happy bank dba american bank and trust" american bank and trust
#2 " sohappy bank dba american bank"        american bank          
#3 "happy bank"                             american bank and trust
#4 "american bank and trust"                american bank and trust
#5 " sohappy bank"                          american bank          
#6 "american bank"                          american bank       
0 голосов
/ 05 апреля 2020

Исходя из ответа @akrun, у нас может быть другой подход

temp <- data.frame(raw_name = c("happy bank dba american bank and trust", 
                            " sohappy bank dba american bank"), 
               clean_name = c("american bank and trust", "american bank"), stringsAsFactors = FALSE)

temp2 <- temp %>% 
  mutate(raw_name = strsplit(raw_name, "\\s*dba\\s*")) %>% 
  unnest(raw_name) %>% 
  bind_rows(temp)

output

  raw_name                                 clean_name             
  <chr>                                    <chr>                  
1 "happy bank"                             american bank and trust
2 "american bank and trust"                american bank and trust
3 " sohappy bank"                          american bank          
4 "american bank"                          american bank          
5 "happy bank dba american bank and trust" american bank and trust
6 " sohappy bank dba american bank"        american bank 

Обновление: если вы хотите удалить пробел в начале строки, вы можете попробуй:

Library(stringr)
temp2$raw_name <- str_squish(temp2$raw_name)
output:
  raw_name                               clean_name             
  <chr>                                  <chr>                  
1 happy bank                             american bank and trust
2 american bank and trust                american bank and trust
3 sohappy bank                           american bank          
4 american bank                          american bank          
5 happy bank dba american bank and trust american bank and trust
6 sohappy bank dba american bank         american bank
...