Разделить строку на первый разделитель, а затем на подстроку, содержащую хотя бы одну цифру - PullRequest
0 голосов
/ 09 апреля 2020

I sh для разделения названий учреждений по адресам в векторе. Мой heuristi c заключается в том, что адрес является правой стороной строки, начиная с первой запятой, за которой следует подстрока, содержащая ди git.

Таким образом, необработанные данные выглядят так:

a <- c("CATHOLIC UNIV KOREA, COLL MED, DEPT LAB MED, SEOUL, SOUTH KOREA", 
"UNIV ULSAN, DEPT LAB MED, COLL MED, 88 OLYMP RO 43 GIL, SEOUL 05505, SOUTH KOREA", 
"UNIV ULSAN, DEPT INTERNAL MED, COLL MED, SEOUL, SOUTH KOREA", 
"ASAN MED CTR, 88 OLYMP RO 43 GIL, SEOUL 05505, SOUTH KOREA", 
"YONSEI UNIV, COLL MED, SEVERANCE HOSP, DEPT LAB MED, 50 YONSEI RO, SEOUL 03722, SOUTH KOREA", 
"KWANGWOON UNIV, DEPT ELECT MAT ENGN, SEOUL 139701, SOUTH KOREA",
"YG 1 CO LTD, 68 CHONGCHON DONG, INCHEON 430030, SOUTH KOREA")

И я хочу:

"CATHOLIC UNIV KOREA, COLL MED, DEPT LAB MED, SEOUL, SOUTH KOREA" ""
"UNIV ULSAN, DEPT LAB MED, COLL MED"                              "88 OLYMP RO 43 GIL, SEOUL 05505, SOUTH KOREA"
"UNIV ULSAN, DEPT INTERNAL MED, COLL MED, SEOUL, SOUTH KOREA"     ""
"ASAN MED CTR"                                                    "88 OLYMP RO 43 GIL, SEOUL 05505, SOUTH KOREA"
"YONSEI UNIV, COLL MED, SEVERANCE HOSP, DEPT LAB MED"             "50 YONSEI RO, SEOUL 03722, SOUTH KOREA"
"KWANGWOON UNIV, DEPT ELECT MAT ENGN"                             "SEOUL 139701, SOUTH KOREA"
""                                                                "YG 1 CO LTD, 68 CHONGCHON DONG, INCHEON 430030, SOUTH KOREA"

РЕДАКТИРОВАТЬ 1: Я перефразировал мой вопрос более систематическим c способом.

РЕДАКТИРОВАТЬ 2: Ди git может встречаться до первого разделителя: я добавил это значение в конец примера данных.

Ответы [ 2 ]

1 голос
/ 09 апреля 2020
#extract left-hand side (name)
al <- trimws(sub("[[:punct:]]+$", "", sub("(^|[^0-9]+,)([^,]+[0-9].*)$", "\\1", a)))
[1] "CATHOLIC UNIV KOREA, COLL MED, DEPT LAB MED, SEOUL, SOUTH KOREA"
[2] "UNIV ULSAN, DEPT LAB MED, COLL MED"                             
[3] "UNIV ULSAN, DEPT INTERNAL MED, COLL MED, SEOUL, SOUTH KOREA"    
[4] "ASAN MED CTR"                                                   
[5] "YONSEI UNIV, COLL MED, SEVERANCE HOSP, DEPT LAB MED"            
[6] "KWANGWOON UNIV, DEPT ELECT MAT ENGN"
[7] ""

#extract right-hand side (address)
ar <- ifelse(grepl("[0-9]", a), trimws(sub("(^|[^0-9]+,)([^,]+[0-9].*)$", "\\2", a)), "")
[1] ""
[2] "88 OLYMP RO 43 GIL, SEOUL 05505, SOUTH KOREA"                   
[3] ""    
[4] "88 OLYMP RO 43 GIL, SEOUL 05505, SOUTH KOREA"                   
[5] "50 YONSEI RO, SEOUL 03722, SOUTH KOREA"                         
[6] "SEOUL 139701, SOUTH KOREA"
[7] "YG 1 CO LTD, 68 CHONGCHON DONG, INCHEON 430030, SOUTH KOREA"

#Combine names and addresses in a dataframe
data.frame(al, ar, stringsAsFactors=F)

РЕДАКТИРОВАТЬ 1: теперь работает и тогда, когда перед первой запятой отображается ди git, используя одинаковое регулярное выражение для левой и правой сторон.

РЕДАКТИРОВАТЬ 2: удаляет запятую из запятой слева сторона.

0 голосов
/ 09 апреля 2020

Решение регулярных выражений Base R:

b <-
  within(data.frame(
    lhs = gsub("\\,\\s+\\d.*|\\,\\s+\\w+\\s+\\d+.*|^\\w+\\s+\\d+.*", "", a)
  ), {
    rhs <-
      sapply(seq_along(lhs), function(i) {
        ifelse(grepl("\\d+", a[i]),
               ifelse(lhs[i] == "", a[i],
                      gsub(paste0(lhs[i], ", "),
                           "",
                           a[i])), "")
      })
  })

Данные:

a <- c("CATHOLIC UNIV KOREA, COLL MED, DEPT LAB MED, SEOUL, SOUTH KOREA", 
       "UNIV ULSAN, DEPT LAB MED, COLL MED, 88 OLYMP RO 43 GIL, SEOUL 05505, SOUTH KOREA", 
       "UNIV ULSAN, DEPT INTERNAL MED, COLL MED, SEOUL, SOUTH KOREA", 
       "ASAN MED CTR, 88 OLYMP RO 43 GIL, SEOUL 05505, SOUTH KOREA", 
       "YONSEI UNIV, COLL MED, SEVERANCE HOSP, DEPT LAB MED, 50 YONSEI RO, SEOUL 03722, SOUTH KOREA", 
       "KWANGWOON UNIV, DEPT ELECT MAT ENGN, SEOUL 139701, SOUTH KOREA",
       "YG 1 CO LTD, 68 CHONGCHON DONG, INCHEON 430030, SOUTH KOREA")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...