如果它们是连续的,我怎么能在向量中反转数字?

时间:2017-03-27 20:54:48

标签: r vector reverse sequential

因此,如果输入是一个向量,例如

v <- (1, 2, 3, 7, 2, 8, 9) 

输出为

(3, 2, 1, 7, 2, 9, 8)

我尝试使用嵌套的for和if循环,条件为is.sorted函数,但没有取得任何成功。

2 个答案:

答案 0 :(得分:8)

使用样本数据

var dict = {}
dict["key1"] = 1
dict["key2"] = 2
dict["key3"] = 3

$.ajax({
        type: "POST",
        url: "/File/Import",
        data: dict,
        dataType: "json"
});

public void Import(Dictionary<string, int?> dict)
{
}

您可以分区为&#34;顺序组&#34;与

std::list<NonCopyable> lst;
// ...
std::map<std::size_t, NonCopyable> map;
for (auto& nc: lst) {
    map.emplace(map.size(), std::move(nc));
}
// use lst.clear() here, if you so inclined

基本上我们会查看前一个元素的差异,并在值不等于1时随时跟踪变化。

您可以使用此组信息重新排序x <- c(1, 2, 3, 7, 2, 8, 9) 的值(这会进行组内转换)。

grp <- cumsum(!c(TRUE, diff(x)==1))
grp
# [1] 0 0 0 1 2 3 3

答案 1 :(得分:5)

我们也可以这样做:

x <- c(0, which(diff(vec) != 1), length(vec))
unlist(sapply(seq(length(x) - 1),  function(i) rev(vec[(x[i]+1):x[i+1]])))

#[1] 3 2 1 7 2 9 8

这个想法是首先根据连续数字的位置剪切矢量。然后我们遍历这些削减并应用rev

数据

vec <- c(1, 2, 3, 7, 2, 8, 9)

<强>基准

library(microbenchmark)
vec1 <- c(1, 2, 3, 7, 2, 8, 9)
vec2 <- c(1:1000, sample.int(100, 10), 5:500, sample.int(100, 10), 100:125)

f_MrFlick <- function(x){
    revsort<-function(...) sort(...,decreasing=TRUE)
    grp <- cumsum(!c(TRUE, diff(x)==1))
    ave(x, grp, FUN=revsort)
}

f_989 <- function(vec){
    x <- c(0, which(diff(vec) != 1), length(vec))
    unlist(sapply(seq(length(x) - 1),  function(i) rev(vec[(x[i]+1):x[i+1]])))
}

all(f_MrFlick(vec1)==f_989(vec1))
# [1] TRUE
all(f_MrFlick(vec2)==f_989(vec2))
# [1] TRUE

length(vec1)
# [1] 7
microbenchmark(f_MrFlick(vec1), f_989(vec1))
# Unit: microseconds
            # expr     min       lq     mean  median       uq     max neval
 # f_MrFlick(vec1) 287.006 297.0585 305.6340 302.833 312.6695 479.912   100
     # f_989(vec1) 113.348 119.7645 124.7901 121.903 127.0360 268.186   100
# --------------------------------------------------------------------------
length(vec2)
# [1] 1542 
microbenchmark(f_MrFlick(vec2), f_989(vec2))
# Unit: microseconds
            # expr      min        lq      mean   median       uq      max neval
 # f_MrFlick(vec2) 1532.553 1565.2745 1725.7540 1627.937 1698.084 3914.149   100
     # f_989(vec2)  426.874  454.6765  546.9115  466.439  489.322 2634.383   100