R 中的字符串向量到命名字符串向量?名称是字符串的一部分

问题描述 投票:0回答:1

我在 R 中有一个字符串向量:

c("apple pie {we have some text here}", "banana{something{something}}", "cherry {asd9asdjsaf}", "banana {monkey})
[1] "apple pie {we have some text here}" "banana {something{something}}"     
[3] "cherry {asd9asdjsaf}"               "banana {monkey}"           

我想将其制作成一个命名字符串向量,以便第一个左大括号充当名称和相应元素之间的分隔符,但它也是元素的一部分,并且如果存在重复的名称,则其下的内容相同的名称将与换行符连接,以便:

                          apple pie                               banana  
"apple pie {we have some text here}"   "{something{something}}\n{monkey}" 
                             cherry  
              "cherry {asd9asdjsaf}"

这可以使用正则表达式和迭代(例如 sapply、循环等)来实现:

library(dplyr)

elemNames <- originalvector %>% gsub("\\{.*", "", .) #remove "{"-character and everything after it
elems <- originalvector %>% sub(".*?\\{", "{", .) #replace "{"-character and everything before it with just "{"-character

names(elems) <- elemNames

newvector <- sapply(unique(elemNames), \(elemName) {
    elems[grep(elemName, names(elems))] %>% {paste(.,collapse = "\n")}
  }) %>% setNames(unique(elemNames))

但是,我想知道是否有更优雅的解决方案(可能是单行)来做到这一点?我最初的解决方案看起来如此丑陋和复杂。 :)

r vector sapply
1个回答
0
投票

您可以使用

tapply()
来简化此操作:

elemNames <- gsub("\\s?\\{.*", "", originalvector)
elems <- sub(".*?\\{", "{", originalvector)
tapply(elems, elemNames, paste, collapse='\n')
#                  apple pie                             banana 
# "{we have some text here}" "{something{something}}\n{monkey}" 
#                     cherry 
#            "{asd9asdjsaf}" 

我稍微修改了您的第一个正则表达式,以便在存在元素名称之后删除空格。

© www.soinside.com 2019 - 2024. All rights reserved.