R-生成一个数字序列
我试图创建6个病例的序列,但间隔144个病例 比如这个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
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