生成具有重复间隔的数字序列
Generate a sequence of numbers with repeated intervals
我正在尝试创建 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)))
我发现 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
然后你可以在一行中完成此操作:
sequence(info$len) + rep(info$start-1, info$len)
# [1] 1 2 3 4 5 6 144 145 146 147 148 149 288 289 290 291 292 293
请注意,即使您合并的序列长度不同,此解决方案也适用。
这也可以使用 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 的数据结构实现此目的的另一种方法(这在需要不同间隔的不同序列长度时尤其有用)
c(with(info, mapply(seq.int, start, length.out=len)))
#[1] 1 2 3 4 5 6 144 145 146 147 148 149 288 289 290 291 292 293
我正在使用 R 3.3.2。 OSX10.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)
AND 预期的序列存储在 a.
[1] 1 2 3 4 5 6 144 145 146 147 148 149 288 289 290 291 292 293
再试一次:
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)
结果:
[1] 1 2 3 4 5 6 144 145 146 147 148 149 288 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
不需要像@josilber 的解决方案那样计算序列的起始值,但序列的长度必须是常数。
从 R >= 4.0.0 开始,您现在可以在一行中使用 sequence
:
sequence(c(6,6,6), from = c(1,144,288))
[1] 1 2 3 4 5 6 144 145 146 147 148 149 288 289 290 291 292 293
第一个参数,nvec
,是每个序列的长度;第二个 from
是每个序列的起点。
作为函数,n
是您想要的间隔数:
f <- function(n) sequence(rep(6,n), from = c(1,144*1:(n-1)))
f(3)
[1] 1 2 3 4 5 6 144 145 146 147 148 149 288 289 290 291 292 293
我正在尝试创建 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)))
我发现 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
然后你可以在一行中完成此操作:
sequence(info$len) + rep(info$start-1, info$len)
# [1] 1 2 3 4 5 6 144 145 146 147 148 149 288 289 290 291 292 293
请注意,即使您合并的序列长度不同,此解决方案也适用。
这也可以使用 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 的数据结构实现此目的的另一种方法(这在需要不同间隔的不同序列长度时尤其有用)
c(with(info, mapply(seq.int, start, length.out=len)))
#[1] 1 2 3 4 5 6 144 145 146 147 148 149 288 289 290 291 292 293
我正在使用 R 3.3.2。 OSX10.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)
AND 预期的序列存储在 a.
[1] 1 2 3 4 5 6 144 145 146 147 148 149 288 289 290 291 292 293
再试一次:
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)
结果:
[1] 1 2 3 4 5 6 144 145 146 147 148 149 288 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
不需要像@josilber 的解决方案那样计算序列的起始值,但序列的长度必须是常数。
从 R >= 4.0.0 开始,您现在可以在一行中使用 sequence
:
sequence(c(6,6,6), from = c(1,144,288))
[1] 1 2 3 4 5 6 144 145 146 147 148 149 288 289 290 291 292 293
第一个参数,nvec
,是每个序列的长度;第二个 from
是每个序列的起点。
作为函数,n
是您想要的间隔数:
f <- function(n) sequence(rep(6,n), from = c(1,144*1:(n-1)))
f(3)
[1] 1 2 3 4 5 6 144 145 146 147 148 149 288 289 290 291 292 293