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

时间:2019-03-18 13:27:26

标签: r vector sapply mapply

我有一个字符向量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中的相应PIN,因此84404中的“ V2”变为“ {{1} }“

b)如果第24个字符是UT 84404,而non-commanon-whitespace中找出逗号前的最后一个空格,直到该索引V1保持不变,剩下的将移至{{1} }。 例如V1具有“ V2”,其中我们在第24个索引处具有“ V1”,因此我们需要将其从“ 8532 West Lyme St. Chesterfield, VA”之后的空白处断开,因此t保持“ St.”和V1保持“ 8532 West Lyme St.”。


在操作结束时我们应该拥有:

V2

编辑:

我在V1上尝试了以下功能,以了解第24个字符是否为逗号:

Chesterfield, VA 23832

返回:

  

TRUE FALSE FALSE FALSE FALSE

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

即我想做:

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

这里1/2/3来自上面的1a和1b。 需要知道如何编写此逻辑。

1 个答案:

答案 0 :(得分:1)

请考虑使用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