Усечение и слияние значений в двухсимвольных векторах - PullRequest
0 голосов
/ 18 марта 2019

У меня есть символьный вектор V1

V1 <- c("377 Peninsula St. Ogden,UT","8532 West Lyme St. Chesterfield, 
VA","43 E. Hilltop Street Hilliard,OH","95 Newcastle St. 
Hendersonville,NC","7276 Rose St. Greenville,NC")

и еще один вектор как V2

V2 <- c(84404,23832,43026,28792,27834)

Теперь у меня есть следующие условия:

1) Разбить каждый элемент на V1 при 24th символе:


a) Если 24-й символ является comma, то разбить строку там, а остальные должны быть добавлены к соответствующей строке в V2. например V1 имеет "377 Peninsula St. Ogden, UT", где мы имеем запятую в 24-м индексе, поэтому нам нужно разбить ее на две части: "377 Peninsula St. Ogden" "UT" (помните, что сама запятая опущена), а затем V1 получает " 377 Peninsula St. Ogden "часть и остаток добавляются к соответствующему ПИН-коду в V2, поэтому" 84404V2 становится" UT 84404 "

b) Если 24-ый символ равен non-comma и non-whitespace, найдите последний пробел перед запятой в V1 и до этого индекса V1, оставшееся доходит до V2. например V1 имеет "8532 West Lyme St. Chesterfield, VA", где у нас есть "t" с 24-м индексом, поэтому нам нужно вырвать его из пробела после "St.", таким образом V1 сохраняет "8532 West Lyme St." и V2 получает "Chesterfield, VA 23832".


К концу операции у нас должно быть:

V1 <- c("377 Peninsula St. Ogden","8532 West Lyme St.",...)
V2 <- c("UT 84404","Chesterfield, VA 23832")

EDIT:

Я попробовал следующую функцию на V1, чтобы узнать, является ли 24-й символ запятой:

unlist(lapply(lapply(V1, function(z){substr(z,24,24)}),function(y){y==","}))

, который возвращает:

ИСТИНА ЛОЖЬ ЛОЖЬ ЛОЖЬ ЛОЖЬ

Теперь, когда я решил одну часть проблемы, мне нужен способ применить логику форматирования на основе приведенного выше результата.

т.е. Я хочу сделать:

unlist(lapply(lapply(V1, function(z){substr(z,24,24)}),function(y){if(y==","){something1} else if(y==" "){something2}else {something3}}))

Здесь что-то 1/2/3 взято из 1a и 1b выше. Нужно уметь писать эту логику.

1 Ответ

1 голос
/ 25 марта 2019

Рассмотрите возможность использования векторизованных методов ifelse, substr и regexpr (то есть без применения циклов):

newV1 <- ifelse(substr(V1, 24, 24) == ",",         # CONDITIONALLY CHECK 24TH CHARACTER
                substr(V1, 1, regexpr(",", V1)-1), # EXTRACT UNTIL 24TH CHARACTER
                substr(V1, 1, 
                       regexpr(" (?=[^ ]+$)", 
                               substr(V1, 1, 24), 
                               perl=TRUE)-1)     # EXTRACT UNTIL LAST SPACE BEFORE 24TH CHAR
                )
newV1
# [1] "377 Peninsula St. Ogden" "8532 West Lyme St."     
# [3] "43 E. Hilltop Street"    "95 Newcastle St."       
# [5] "7276 Rose St."        

newV2 <- paste(ifelse(substr(V1, 24, 24) == ",",   # CONDITIONALLY CHECK 24TH CHARACTER
               substr(V1, regexpr(",", V1)+1, 
                      nchar(V1)),                  # EXTRACT AFTER 24TH CHARACTER
               substr(V1, 
                      regexpr(" (?=[^ ]+$)", 
                              substr(V1, 1, 24), 
                              perl=TRUE)+1, 
                      nchar(V1))),               # EXTRACT AFTER LAST SPACE BEFORE 24TH CHAR
               V2)                               # PASTE V2 VECTOR ELEMENTWISE
newV2
# [1] "UT 84404"                "Chesterfield, VA 23832" 
# [3] "Hilliard,OH 43026"       "Hendersonville,NC 28792"
# [5] "Greenville,NC 27834"   

Rextester Demo

...