【问题标题】:Efficiently Finding Sequences Between Vectors of Start and End Numbers in R [duplicate]在 R 中有效地查找开始和结束数字向量之间的序列
【发布时间】:2020-08-31 17:29:51
【问题描述】:

我在 R 中有两个向量,例如 start_valuesend_values,它们包含递增值的编号元素。例如:

start_values <- c(88, 241, 394, 545)
end_values <- c(147, 300, 453, 604)

我正在尝试找到一个有效的(希望不编写循环),它将允许我获得一个数字序列,其数字序列范围从start_values 中的第一个元素到@987654325 中的第一个元素@,然后从start_values 中的第二个元素到end_values 中的第二个元素,等等。所以最后,我想要一个名为sequence_range 的向量,它看起来像这样:

sequence_range <- c(seq(88, 147), seq(241, 300), seq(394, 453), seq(545, 604))

应该有如下输出:

> sequence_range
  [1]  88  89  90  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
 [30] 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
 [59] 146 147 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
 [88] 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
[117] 297 298 299 300 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418
[146] 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447
[175] 448 449 450 451 452 453 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567
[204] 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596
[233] 597 598 599 600 601 602 603 604

我很感激任何关于有效技术的想法来实现这一点,以便它可以推广到任何两个开始值和结束值的向量。

谢谢。

【问题讨论】:

    标签: r vectorization sequence


    【解决方案1】:

    您可以在 apply 上的 cbinded 向量中使用 :

    as.vector(apply(cbind(start_values, end_values), 1, function(x) x[1]:x[2]))
    # [1]  88  89  90  91  92  93  94  95  96  97  98  99 100 101
    # [15] 102 103 104 105 106 107 108 109 110 111 112 113 114 115
    # [29] 116 117 118 119 120 121 122 123 124 125 126 127 128 129
    # [43] 130 131 132 133 134 135 136 137 138 139 140 141 142 143
    # [57] 144 145 146 147 241 242 243 244 245 246 247 248 249 250
    # [71] 251 252 253 254 255 256 257 258 259 260 261 262 263 264
    # [85] 265 266 267 268 269 270 271 272 273 274 275 276 277 278
    # [99] 279 280 281 282 283 284 285 286 287 288 289 290 291 292
    # [113] 293 294 295 296 297 298 299 300 394 395 396 397 398 399
    # [127] 400 401 402 403 404 405 406 407 408 409 410 411 412 413
    # [141] 414 415 416 417 418 419 420 421 422 423 424 425 426 427
    # [155] 428 429 430 431 432 433 434 435 436 437 438 439 440 441
    # [169] 442 443 444 445 446 447 448 449 450 451 452 453 545 546
    # [183] 547 548 549 550 551 552 553 554 555 556 557 558 559 560
    # [197] 561 562 563 564 565 566 567 568 569 570 571 572 573 574
    # [211] 575 576 577 578 579 580 581 582 583 584 585 586 587 588
    # [225] 589 590 591 592 593 594 595 596 597 598 599 600 601 602
    # [239] 603 604
    

    【讨论】:

      【解决方案2】:

      mapply 效果很好:

      > as.vector(mapply(seq,start_values,end_values))
        [1]  88  89  90  91  92  93  94  95  96  97  98  99 100 101
       [15] 102 103 104 105 106 107 108 109 110 111 112 113 114 115
       [29] 116 117 118 119 120 121 122 123 124 125 126 127 128 129
       [43] 130 131 132 133 134 135 136 137 138 139 140 141 142 143
       [57] 144 145 146 147 241 242 243 244 245 246 247 248 249 250
       [71] 251 252 253 254 255 256 257 258 259 260 261 262 263 264
       [85] 265 266 267 268 269 270 271 272 273 274 275 276 277 278
       [99] 279 280 281 282 283 284 285 286 287 288 289 290 291 292
      [113] 293 294 295 296 297 298 299 300 394 395 396 397 398 399
      [127] 400 401 402 403 404 405 406 407 408 409 410 411 412 413
      [141] 414 415 416 417 418 419 420 421 422 423 424 425 426 427
      [155] 428 429 430 431 432 433 434 435 436 437 438 439 440 441
      [169] 442 443 444 445 446 447 448 449 450 451 452 453 545 546
      [183] 547 548 549 550 551 552 553 554 555 556 557 558 559 560
      [197] 561 562 563 564 565 566 567 568 569 570 571 572 573 574
      [211] 575 576 577 578 579 580 581 582 583 584 585 586 587 588
      [225] 589 590 591 592 593 594 595 596 597 598 599 600 601 602
      [239] 603 604
      

      【讨论】:

      • 不错,但使用`:`seq 的两倍!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 2021-01-25
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多