在R中生成序列

时间:2015-08-26 19:12:04

标签: r

我正在使用R中的列表,看起来像这样

add:
    .page {
        min-height: 100vh; /*min-height not height :)*/
    }

现在假设我想要生成与此列表对应的数字列表,如此

<?php

if(filter_var($_POST['txtNumero'], FILTER_VALIDATE_INT) AND in_array(substr($_POST['txtNumero'], 0, 1), array(6, 7, 8))) {
    echo "Correct";
} else {
    echo "Incorrect";
}

?>

换句话说,第一个列表给出了从1到16的数字序列列表的组,第二个列表给出了每个组的开始和结束。

如果你考虑序列

,这可能更容易看到

1 2 3-6 7-10 11 12-15 16

有一种简单的方法吗?我想我可以使用某种全局索引和lapply来做它,但我想看看是否有更简单的方法。

3 个答案:

答案 0 :(得分:4)

这是一种方式

# alternate input suggested by @MichaelChirico
d = c(0,0,3,3,0,3,0)

# my preferred approach
library(data.table) # version 1.9.5+
Map(c, 
  seq_along(d)+shift(cumsum(d), type="lag", fill=0),
  seq_along(d)+cumsum(d)
)

@akrun的类似变体:

# alternate input, starting from OP's
d2 = c(0, 0, 4, 4, 0, 4, 0)
d2 = replace( d2, !d2, 1)

# @akrun's answer
Map(c, cumsum(d2)-d2+1, cumsum(d2))

还有一些:

# my original answer
start = c(1,head(cumsum(d+1)+1,-1))
Map(c, start, start + d)

# another way
s = sequence(d+1)
Map(c, seq_along(s)[s==1], seq_along(s)[c(diff(s) < 1, TRUE)] )

答案 1 :(得分:3)

这是一种略有不同的方法:

x <-  c(0,0,3,3,0,3,0)

f <- function(x) {
    ee <- split(seq_len(sum(x+1)), rep.int(seq_along(x), x+1))
    lapply(ee, range)
}
f(x)

答案 2 :(得分:1)

这是一个能够做到这一点的功能,不像@ Frank的回答那么优雅:

mygenerator <- function(vec){
  counter <- 1
  outlist <- list()
  for(i in 1:length(vec)){
    if(vec[i] == 0){
      outlist[[i]] <- c(counter, counter)
      counter <- counter + 1
    } else {
      outlist[[i]] <- c(counter, counter + vec[i] - 1)
      counter <- counter + vec[i]
    }
  }
  outlist
}

mygenerator(c(0, 0, 4, 4, 0, 4, 0))

[[1]]
[1] 1 1

[[2]]
[1] 2 2

[[3]]
[1] 3 6

[[4]]
[1]  7 10

[[5]]
[1] 11 11

[[6]]
[1] 12 15

[[7]]
[1] 16 16