这个问题在这里已有答案:
想要使用来自向量的值创建整数序列,seq =(x1:y1,x2:y2,x3:y3 ... xn:yn)其中(x1 <y1 <x2 <y2 ... xn <yn)。它变得困难,因为n是随机的但总是取整数值。
我已经尝试创建一个条件if语句和一个for循环,两者都导致....没有。
x <- c(1, 10, 26, 40)
y <- c(5, 13, 30, 51)
通常情况下,我就足够了
seqq <- c(seq(x1,y1,1),seq(x2,y2,1)...)
但是当n具有(或多或少)随机长度时会出现困难。试图使用for循环,即
seqq <- c()
for (i in 1:length(x)){
seqq[i] <- seq(x[i], y[i],1) #I know this would technically create a vector of sequences
i <- i+1
}
#results in
Error in seq.default(x[i], y[i], 1) : 'from' must be a finite number
澄清我正在寻找
seqq <- c(1,2,3,4,5,10,11,12,13,26,27,28,29,30,40,...,51)
同样,如果/ while语句实际上没有做任何建议?谢谢
我们可以使用Map
来获取'x'和'y'的相应元素之间的序列,然后unlist
list
的vector
unlist(Map(`:`, x, y))
#[1] 1 2 3 4 5 10 11 12 13 26 27 28 29 30 40 41 42 43 44 45 46 47 48 49 50 51
与tidyverse
类似的选择将是
library(tidyverse)
map2(x, y, `:`) %>%
flatten_int
注意:我们也可以用:
更改seq
,也可以使用。默认情况下,by
为1.如果我们需要生成具有不同by
的序列,那将更加通用
关于OP与for
循环的问题,seqq
被定义为NULL
向量。所以,如果我们做seqq[i]
,就没有要索引的元素。在这种情况下,最好在每次迭代中连接(c
)并将其分配给'seqq',这样向量的大小会增加,并在每个迭代的末尾附加值
for(i in seq_along(x)) seqq <- c(seqq, seq(x[i], y[i]))