我正在尝试打印一个介于1和100之间的向量,这些向量在R中不能被2,3和7整除。
我尝试了seq
,但我不确定如何继续。
答案 0 :(得分:7)
另一个选择是使用Filter
,以及过滤任何符合您条件的数字的序列:
Filter(function(i) { all(i %% c(2,3,7) != 0) }, seq(100))
## [1] 1 5 11 13 17 19 23 25 29 31 37 41 43 47 53 55 59 61 65 67 71 73 79 83 85 89 95 97
请注意,虽然这可能(IMO)最具可读性,但在性能方面却是最糟糕的(到目前为止):
更新以考虑rawr的for
循环解决方案:
microbenchmark(
filter={ v1 <- seq(100); Filter(function(i) { all(i %% c(2,3,7) != 0) }, v1) },
reduce={ v1 <- seq(100); v1[!Reduce(`|`,lapply(c(2,3,7), function(x) !(v1 %%x)))] },
rowout={ v1 <- seq(100); v1[rowSums(outer(v1, c(2, 3, 7), "%%") == 0) == 0] },
looopy={ v1 <- seq(100); for (ii in c(2,3,7)) v1 <- v1[-which(v1 %% ii == 0)]; v1 },
times=1000
)
## Unit: microseconds
## expr min lq mean median uq max neval cld
## filter 108.280 118.7000 143.88592 126.2155 136.6290 2349.952 1000 c
## reduce 21.552 23.8095 25.91997 24.8150 25.8580 144.067 1000 ab
## rowout 26.075 28.4920 31.11812 29.5350 31.2125 184.225 1000 b
## looopy 14.149 16.0765 18.11806 16.8995 17.8595 160.485 1000 a
为了公平起见我向所有人添加了序列生成(而且,我这样做是为了比较相对性能与实际速度,所以比较结果仍然有效。)
原始声明:
“不出所料,akrun是最佳的:-)”
现在被取代:
“毫不奇怪,rawr是最佳的:-)”
答案 1 :(得分:5)
我们可以使用模数运算符使用lapply
循环执行此操作,通过否定(!
)将0转换为TRUE,使用Reduce
使用|
来查找相应的list
元素为TRUE,否定和“v1”
v1[!Reduce(`|`,lapply(c(2,3,7), function(x) !(v1 %%x)))]
或者不是循环,这也可以更快的方式完成。
v1[!(!v1%%2) + (!v1%%3) + (!v1%%7)]
v1 <- seq(100)
答案 2 :(得分:4)
基本上你想要计算1:100
模2,3和7中的每个数字。你可以使用outer
在单个向量化操作中执行所有模运算,使用{{1识别rowSums
中未完全除以2,3或7的元素。
1:100
答案 3 :(得分:3)
其他答案更好,但如果你真的需要使用for
循环,如this question所示,这可能是一种可能性:
x <- vector()
n <- 1L
for(i in 1:100){if (i%%2!=0 & i%%3!=0 & i%%7!=0) {x[n] <- i; n <- n+1}}
#> x
# [1] 1 5 11 13 17 19 23 25 29 31 37 41 43 47 53 55 59 61 65 67 71 73 79 83 85 89 95 97
如前所述,此处发布的其他答案更好,因为它们利用了R的矢量化功能。此处显示的短代码可能比任何其他答案都慢,维护起来更复杂。它是应用于R的其他编程语言(如C或FORTRAN)的典型语法。它可以工作,但它不是应该完成的方式。
答案 4 :(得分:0)
我们可以通过倒计时轻松生成负模数序列,而不是明确地使用模运算。然后,对于三个序列中的每一个,我们可以将它们全部OR,然后将其放入which()
。
which(as.logical(pmin(rep_len(1:0, 100),
rep_len(2:0, 100),
rep_len(6:0, 100))))
如果我们希望硬编码少一点,我们可以将do.call
与lapply()
一起使用:
which(as.logical(do.call(pmin, lapply(c(2,3,7)-1, function(x)rep_len(x:0, 100)))))
编辑:
以下是使用逻辑的一种方法:
v1 <- logical(100); for (ii in c(2,3,7) -1) v1 <- v1 | rep_len(rep(c(F,T), c(ii,1)), 100) ; which(!v1)
答案 5 :(得分:-1)
我在课堂上遇到了同样的问题。我假设老师给了我找到答案所需的所有信息,我是正确的。这是第一周,其他高级人员使用的所有其他愚蠢的东西都没有出现。
不过我是这样做的。
r = c(1:100)
which(r %% 3 == 0 & r %% 7 == 0 & r %% 2 == 0)
使用 which
函数。