我编写了一个递归函数,可以找出你传入的向量中所有连续的三元组(至少需要传入三个向量)。这个函数可能有点粗糙,但似乎能够正常工作。
该函数使用省略号
...
来传递参数。因此,它将获取您提供的任意数量的参数(即数字向量),并将它们放在列表
items
中。然后,找到每个传递向量中的最小值及其索引。
接下来,创建对应于最小三元组的向量的索引,并使用
for()
循环迭代这些索引,将输出值传递给输出向量
out
。然后,以递归方式修剪和重新传递
items
中的输入向量。只有当所有向量都是
NA
时,也就是向量中没有更多值时,函数才返回最终结果。
library(magrittr)
tripl <- function(...){
items <- list(...)
triplet.id <- lapply(items, function(x){
if(is.na(x) %>% prod) id <- c(NA, NA)
else id <- c(which(x == min(x)), x[which(x == min(x))])
}) %>% unlist %>% matrix(., ncol=2, byrow=T)
index <- order(triplet.id[,2])[1:3]
out <- vector()
for(i in index){
if(length(items[[i]]) == 1) {
out <- append(out, items[[i]])
items[[i]] <- NA
}
else {
out <- append(out, items[[i]][triplet.id[i,1]])
items[[i]] <- items[[i]][-triplet.id[i,1]]
}
}
if(!prod(unlist(is.na(items)))) out <- append(list(out),
do.call("tripl", c(items), quote = F))
else(out <- list(out))
return(out)
}
该函数可以通过将输入向量作为参数传递来调用。
a = c(3,5)
b = c(6,1,8,7)
c = c(4,2,9)
y <- tripl(a,b,c)
结果是一个列表,其中包含所有必要的信息,尽管无序。
print(y)
使用sapply()
可以完成所有的排序:
sapply(y, function(x){x[order(x)]}) %>% t
事实上,它将仅使用每个向量的一个值来查找三元组。因此,在例如 c(6,7,11), c(8,9,13)和 c(10,12,14)之间,它将无法找到连续的三元组 c(6,7,8)。在这种情况下,它将返回 c(6,8,10)(见下文)。
a<-c(6,7,11)
b<-c(8,9,13)
c<-c(10,12,14)
y <- tripl(a,b,c)
sapply(y, function(x){x[order(x)]}) %>% t
{2,3,4}
会被视为一个有效的三元组吗? - Psidom