R-生成一个数字序列

R-生成一个数字序列,r,numbers,sequence,R,Numbers,Sequence,我试图创建6个病例的序列,但间隔144个病例 比如这个 c(1:6, 144:149, 288:293) 1 2 3 4 5 6 144 145 146 147 148 149 288 289 290 291 292 293 我怎样才能自动生成这样一个序列 seq 还是有其他功能 这里有一种方法: unlist(lapply(c(0L,(1:2)*144L-1L),`+`,seq_len(6))) # or... unlist(lapply(c(1L,(1:2)*14

我试图创建6个病例的序列,但间隔144个病例

比如这个

c(1:6, 144:149, 288:293)

1   2   3   4   5   6 144 145 146 147 148 149 288 289 290 291 292 293
我怎样才能自动生成这样一个序列

seq 
还是有其他功能

这里有一种方法:

unlist(lapply(c(0L,(1:2)*144L-1L),`+`,seq_len(6)))
# or...
unlist(lapply(c(1L,(1:2)*144L),function(x)seq(x,x+5)))
以下是我更喜欢的一种方式:

rep(c(0L,(1:2)*144L-1L),each=6) + seq_len(6)
概括

rlen  <- 6L
rgap  <- 144L
rnum  <- 3L

starters <- c(0L,seq_len(rnum-1L)*rgap-1L)

rep(starters, each=rlen) + seq_len(rlen)
# or...
unlist(lapply(starters+1L,function(x)seq(x,x+rlen-1L)))

rlen我发现
sequence
函数在这种情况下很有用。如果您的数据采用如下结构:

(info <- data.frame(start=c(1, 144, 288), len=c(6, 6, 6)))
#   start len
# 1     1   6
# 2   144   6
# 3   288   6

请注意,即使要组合的序列长度不同,此解决方案也有效。

也可以使用
seq
seq.int

x = c(1, 144, 288)
c(sapply(x, function(y) seq.int(y, length.out = 6)))

#[1]   1   2   3   4   5   6 144 145 146 147 148 149 288 289 290 291 292 293
正如@Frank在这里的评论中提到的,这是使用@josilber的数据结构实现这一点的另一种方法(这在需要不同间隔的不同序列长度时尤其有用)


我使用的是R3.3.2。OSX 10.9.4

我试过:

a<-c()  # stores expected sequence
f<-288  # starting number of final sub-sequence
it<-144 # interval
for (d in seq(0,f,by=it))
{
    if (d==0)
    {
        d=1
    }
    a<-c(a, seq(d,d+5))
    print(d)
}
print(a)
结果是:


[1]123456144 146 147 148 149 289 290 291 292 293 432 433 434 435 436 437
我用
cumsum
函数解决了这个问题

seq_n <- 3 # number of sequences
rep(1:6, seq_n) + rep(c(0, cumsum(rep(144, seq_n-1))-1), each = 6)
# [1]   1   2   3   4   5   6 144 145 146 147 148 149 288 289 290 291 292 293

seq\n我觉得应该有一个更优雅的解决方案来解决这个问题。unlist(lappy(…)可以替换为sapply@hedgedandlevered是的,我也试过了,但它给出了一个矩阵。。。如果我使用simplify=FALSE进行sapply,我会返回到lappy结果。我可以做
c(sapply(…)
,Isuppose@MikeWise是的,
seq_len
只是稍微快一点,他们说,尽管我怀疑这在这个应用程序中是否重要。只是习惯而已。另外,对于“泛化”,我必须写
`:`(1,rlen)
,这有点尴尬。@giacomoV,没有急于接受的意思。我对我的答案不感兴趣,所以我还是让你把问题留一两天,看看是否找到更好的答案。是的,考虑到OP示例中的异常间隔,以这种方式明确存储结构可能是个好主意。从
页面,请注意,sequence@josilber-I仍然需要手动填充
c(1144288)
?如果我想要10个序列或100个6位数的序列呢?你的解决方案是什么?thanks@giacomoV如果起点和长度没有模式,那么当然需要手动指定。如果有一个模式的起点和长度,那么它将更容易。例如,如果您想要100个长度为6的序列,从0开始每次增加144个起始点,那么您可以使用
info是的,这很好。我觉得奇怪的是,即使我切换到
x=c(1L,144L,288L)
,我也不能得到整数的结果。我认为这是
seq
如何对待
length.out
的一个缺陷<代码>seq.int
似乎做了“正确”的事情,幸运的是。是的,我知道。
seq(1L,length.out=6)
的结果应该是一个整数向量。我在批评函数是如何工作的,而不是你的答案(在我看来这是迄今为止最好的答案)。不过,如果
x
是一个整数,并用
seq.int
代替
seq
,那么最终结果将是一个整数向量(如OP的示例)。不幸的是,您可以通过定义
子长度@CarlWitthoft来扩展功能,
seq
/
seq.int
未在
length.out
参数中矢量化。这仅仅意味着
mapply
将是一条出路,而不是
sapply
。使用约瑟伯的数据结构,
c(带有(info,mapply(seq.int,start,length.out=len))
@Frank似乎是一个优先选择:)
a<-c()  # stores expected sequence
f<-288  # starting number of final sub-sequence
it<-144 # interval
for (d in seq(0,f,by=it))
{
    if (d==0)
    {
        d=1
    }
    a<-c(a, seq(d,d+5))
    print(d)
}
print(a)
a<-c()  # stores expected sequence
it<-144 # interval
lo<-4   # number of sub-sequences
for (d in seq(0,by=it, length.out = lo))
{
    if (d==0)
    {
        d=1
    }
    a<-c(a, seq(d,d+5))
    print(d)
}
print(a)
seq_n <- 3 # number of sequences
rep(1:6, seq_n) + rep(c(0, cumsum(rep(144, seq_n-1))-1), each = 6)
# [1]   1   2   3   4   5   6 144 145 146 147 148 149 288 289 290 291 292 293