【问题标题】:R: Seq generation from sequences using vector points and for loops [duplicate]R:使用向量点和for循环从序列生成序列[重复]
【发布时间】:2019-04-24 15:19:31
【问题描述】:

希望使用向量中的值创建整数序列,seq = (x1:y1, x2:y2, x3:y3...xn:yn) where (x1

我尝试创建一个条件 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)

同样,if/while 语句实际上并没有做任何事情 有什么建议么?谢谢

【问题讨论】:

    标签: r seq


    【解决方案1】:

    我们可以使用Map得到'x'和'y'对应元素之间的序列,然后unlist得到listvectors的序列

    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 的序列,这将更通用


    关于for 循环的OP 问题,seqq 被定义为NULL 向量。因此,如果我们执行seqq[i],则没有要索引的元素。在这种情况下,最好在每次迭代中连接 (c) 并将其分配给 'seqq',这样向量的大小就会增加,并在最后附加每次迭代的值

    for(i in seq_along(x)) seqq <- c(seqq, seq(x[i], y[i]))
    

    【讨论】:

    • 这很简单,谢谢!
    猜你喜欢
    • 2018-12-01
    • 2021-04-18
    • 2013-07-31
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多