如何解决基于几种模式重新排序 R 向量
vec <- c("a: 25","g: 32","h: 44","i: 88","","a: 22","i: 53a","h: 4.2","g: rt","a: zzz","h: 53","g: 634","i: 4","qq\t5.6","a: p","h: r","i: 6","g: 6","")
beg_pattern <- "a: "; end_element <- ""
grep_pattern1 <- "g: "; grep_pattern2 <- "h: "
desired_reordered_vec <- c("a: 25","")
本质上,我想重新排序我的向量,以便在以 beg_pattern 开始并以 end_element 结尾的每个元素块中,我的“g”元素出现在我的“h”元素之前。在这个例子中有不止一个有效的解向量。在我的实际数据中,模式是不同的,除了结束元素,每个块会有 20-200 个元素。我的问题包含以下三个问题的元素:How to split vector into list based on consecutive unique values、Split a vector into chunks、Split a vector into three vectors of unequal length in R。但我还没有能够拼凑出一个解决方案。我可以通过这种方式获取我的索引:
a <- grep("a: ",vec); z <- which("" == vec)
u <- grep("g: ",vec); v <- grep("h: ",vec)
但我不确定其中哪些(如果有)将帮助我执行所需的重新排序。
解决方法
您可以在 Base R 中编写一个函数来执行此操作:
my_sort <- function(x){
y <- grep('^(g|h):',x)
x[y] <- x[y][match(sub(":.*","",x[y]),c("g","h"))]
x
}
f <- head(cumsum(vec == ''),-1)
ave(vec,c(f[1],f),FUN = my_sort)
[1] "a: 25" "g: 32" "h: 44" "i: 88" "" "a: 22" "i: 53a" "g: rt" "h: 4.2" "" "a: zzz"
[12] "g: 634" "h: 53" "i: 4" "qq\t5.6" "" "a: p" "g: 6" "i: 6" "h: r" ""
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。