截断和合并两个字符向量中的值

Truncation and merging values in two character vectors

我有一个字符向量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) 在 24th 个字符处打破 V1 中的每个项目:


a) 如果第 24 个字符是 comma 则在此处断开字符串,其余应添加到 V2 中的相应字符串。 例如V1 有“377 Peninsula St. Ogden, UT”,其中我们在第 24 个索引处有逗号,因此我们需要将其分成两个“377 Peninsula St. Ogden”和“UT”(注意逗号本身被省略了) 然后 V1 得到“377 Peninsula St. Ogden”部分,剩余的部分添加到 V2 中的相应 PIN,因此 V2 中的“84404”变为“UT 84404

b) 如果第 24 个字符是 non-comma 并且 non-whitespace 找到 V1 中逗号前的最后一个空格并且直到该索引 V1 保留,剩下的转到 V2。 例如V1 有“8532 West Lyme St. Chesterfield, VA”,其中我们在第 24 个索引处有“t”,因此我们需要将它从“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")

编辑:

我在 V1 上尝试了以下函数来了解第 24 个字符是否为逗号:

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

其中 returns:

TRUE FALSE FALSE FALSE FALSE

现在我已经解决了问题的一部分,我需要一种方法来应用基于上述结果的格式化逻辑。

即我想做:

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

这里something1/2/3来自上面的1a和1b。 需要知道这个逻辑怎么写。

考虑以下使用 ifelsesubstrregexpr 的向量化方法(即,无应用循环):

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