【问题标题】:Creating a sequence with a gap within a range创建一个范围内有间隙的序列
【发布时间】:2016-03-07 12:46:21
【问题描述】:

我正在尝试创建一个范围内的数字序列,跳过每 4 个数字。我知道它可能以某种方式涉及seqseq_len,但我似乎无法弄清楚。

顺序应该是这样的:

c(1,2,3,5,6,7,9,10,11...48)

【问题讨论】:

  • 我认为48 不应该出现在您的序列中。一种方式:(1:48)[as.logical((1:48) %% 4)].
  • 你是对的,48不应该出现在里面。我的错。我需要直到 48 的范围,但实际上跳过了它。这是我需要的完整序列:c(1,2,3, 5,6,7, 9,10,11, 13,14,15, ...直到 47)。你的方法很完美!
  • 你的代码是什么样的?
  • 请选择以下答案之一。

标签: r seq rep


【解决方案1】:
x <- 1:48
x[x%%4!=0]
# [1]  1  2  3  5  6  7  9 10 11 13 14 15 17 18 19 21 22 23 25 26 27 29 30 31 33 34 35
# [28] 37 38 39 41 42 43 45 46 47

更新: 我找到了一种更快的方法。

x <- 1:48e6
mbm <- microbenchmark(
 steven = x[-seq.int(0L, length(x), 4L)],
 venyao1 = x[x %% 4 != 0],
 venyao2 = as.vector(matrix(x, nrow=4)[-4, ]),
 pascal = x[as.logical((x) %% 4)],
 times = 10
)

mbm
# Unit: milliseconds
#    expr       min        lq      mean    median        uq      max neval
# steven 1519.4170 1524.0044 1553.3609 1554.0616 1554.7951 1639.989    10
# venyao1 3323.2142 3327.3154 3382.2387 3369.9388 3426.3029 3502.881    10
# venyao2  919.8674  921.3917  932.3078  923.1563  923.6811 1007.784    10   
# pascal 3207.6932 3211.9832 3245.4686 3213.5090 3299.4639 3356.368    10

【讨论】:

  • (+1) 很奇怪...与 stevens 方法相比,我无法重现您的结果,我得到了相同的速度(ubuntu x32,R3.2.2)。但是,如果您将 as.vector 更改为 as.integer,您的会更快一些
  • 我不知道。可能跟环境有关。我在 Linux、X64、R3.1.1
  • 颜燕,@StevenBeaupré;是的,我认为这一定与系统有关,甚至可能与 PC 有关——尽管我们三个之间的结果完全相反,但对差异的数量级感到惊讶。好处是你的方法都很快。
  • 来自microbenchmark ... 根据底层操作系统,定时采用不同的方法 ....
  • 干杯史蒂文。显然在这种情况下它并不重要,但我确实发现差异很有趣。都在 *nix (me x32) 上,所以我猜有些不同是在我们的 PC 上(cpu 速度,也许是缓存?),但我真的没有史酷比。 (....@VenYao ;抱歉在之前的评论中把你的名字弄错了......这些天真的需要戴上我的眼镜)
【解决方案2】:

另一种选择:

x <- 1:48
x[-seq.int(0L, length(x), 4L)]

基准测试

x <- 1:48e6

library(microbenchmark)
mbm <- microbenchmark(
  steven    = x[-seq.int(0L, length(x), 4L)],
  venyao    = x[x %% 4 != 0],
  venyao2   = as.vector(matrix(x, nrow=4)[-4, ]),
  pascal    = x[as.logical((x) %% 4)],
  user20650 = as.integer(matrix(x, nrow=4)[-4, ]),
  times = 10
)

#Unit: milliseconds
#      expr       min        lq      mean    median        uq       max neval  cld
#    steven  326.2159  350.6567  354.2743  357.3672  359.9924  368.3123    10 a   
#    venyao 1388.9975 1395.8814 1417.3213 1400.1432 1455.2255 1470.7743    10    d
#   venyao2  613.9878  637.5377  639.1718  637.9342  640.1753  657.6627    10  b  
#    pascal 1236.6055 1243.8149 1265.1976 1249.1046 1304.5699 1316.8247    10   c 
# user20650  587.8511  596.5614  610.4037  602.3607  619.1915  670.8756    10  b  

【讨论】:

  • 更好。我仍在学习 R,并试图制作一个多箱线图,将某些变量分组,留下一个间隔。谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 2012-07-26
  • 1970-01-01
相关资源
最近更新 更多