我想通过使用rep
或任何其他函数在R中创建以下序列。
[1, 2, 3, 4, 5, 2, 3, 4, 5, 3, 4, 5, 4, 5, 5]
基本上,c(1:5, 2:5, 3:5, 4:5, 5:5)
。
您提到的rep
让我想起了replicate
,因此这里有一个非常有状态的解决方案。我之所以提出这一点,是因为它短小而不同寻常,而不是因为它好。这是一个非常独特的R。
vect <- 0:5
unlist(replicate(5, vect <<- vect[-1]))
[1] 1 2 3 4 5 2 3 4 5 3 4 5 4 5 5
您可以将rep
和lappy
组合使用,但基本上与Merijn van Tilborg的答案相同。
当然,真正无畏的unidomatic R用户做到了这一点,并拒绝进一步详细说明。
mat <- matrix(1:5, ncol = 5, nrow = 5, byrow = TRUE)
mat[lower.tri(mat)] <- 0
c(t(mat)[t(mat != 0)])
[1] 1 2 3 4 5 2 3 4 5 3 4 5 4 5 5
unlist(lapply(1:5, function(i) i:5))
# [1] 1 2 3 4 5 2 3 4 5 3 4 5 4 5 5
一些针对所有答案的速度测试记录了OP提到的10公里,如果我没记错的话
s1 <- function(n) {
unlist(lapply(1:n, function(i) i:n))
}
s2 <- function(n) {
unlist(lapply(seq_len(n), function(i) seq(from = i, to = n, by = 1)))
}
s3 <- function(n) {
vect <- 0:n
unlist(replicate(n, vect <<- vect[-1]))
}
s4 <- function(n) {
m <- matrix(1:n, ncol = n, nrow = n, byrow = TRUE)
m[lower.tri(m)] <- 0
c(t(m)[t(m != 0)])
}
s5 <- function(n) {
m <- matrix(seq.int(n), ncol = n, nrow = n)
m[lower.tri(m, diag = TRUE)]
}
s6 <- function(n) {
out <- c()
for (i in 1:n) {
out <- c(out, (1:n)[i:n])
}
out
}
library(rbenchmark)
n=5
n = 5L
benchmark(
"s1" = { s1(n) },
"s2" = { s2(n) },
"s3" = { s3(n) },
"s4" = { s4(n) },
"s5" = { s5(n) },
"s6" = { s6(n) },
replications = 1000,
columns = c("test", "replications", "elapsed", "relative")
)
不要被一些“快速”解决方案所愚弄,这些解决方案几乎不使用任何需要时间调用的函数,并且差异会乘以1000倍的复制。
test replications elapsed relative
1 s1 1000 0.05 2.5
2 s2 1000 0.44 22.0
3 s3 1000 0.14 7.0
4 s4 1000 0.08 4.0
5 s5 1000 0.02 1.0
6 s6 1000 0.02 1.0
n=1000
n = 1000L
benchmark(
"s1" = { s1(n) },
"s2" = { s2(n) },
"s3" = { s3(n) },
"s4" = { s4(n) },
"s5" = { s5(n) },
"s6" = { s6(n) },
replications = 10,
columns = c("test", "replications", "elapsed", "relative")
)
正如海报已经提到的“不做”,我们看到的
循环比任何其他方法都变得相当慢,在n=1000L
上
test replications elapsed relative
1 s1 10 0.17 1.000
2 s2 10 0.83 4.882
3 s3 10 0.19 1.118
4 s4 10 1.50 8.824
5 s5 10 0.29 1.706
6 s6 10 28.64 168.471
n=10000
n = 10000L
benchmark(
"s1" = { s1(n) },
"s2" = { s2(n) },
"s3" = { s3(n) },
"s4" = { s4(n) },
"s5" = { s5(n) },
# "s6" = { s6(n) },
replications = 10,
columns = c("test", "replications", "elapsed", "relative")
)
在大n的情况下,我们看到矩阵与其他方法相比变得非常慢。在应用程序中使用seq可能更简洁,但也有一个权衡,因为调用该函数n次会增加流转时长。虽然seq_len(n)比1: n更好,并且只运行一次。有趣的是,复制方法是最快的。
test replications elapsed relative
1 s1 10 5.44 1.915
2 s2 10 9.98 3.514
3 s3 10 2.84 1.000
4 s4 10 72.37 25.482
5 s5 10 35.78 12.599
使用序列
。
sequence(5:1, from = 1:5)
[1] 1 2 3 4 5 2 3 4 5 3 4 5 4 5 5
第一个参数,nvec
,是每个序列的长度(5:1
);第二个参数,from
,是每个序列(1:5
)的起点。
注意:这仅适用于R
sequence()
[…]从]获取参数[例如,以生成更复杂的序列。
灵感来源于如何在R?中创建数字序列的帖子 问题: 我想在NumPy中制作以下序列。 我尝试了以下方法: Non-generic and hard coding using 上面的解决方案是通用的,但我想知道是否有更有效的方法在NumPy中实现。
下面是我的代码: 我想用一个新的测试列创建一个空的dataframe,该列是空的,并调用“exp”
问题内容: 我正在尝试在MySQL中创建序列(从整体上来说,我对SQL还是很新的)。我正在使用以下代码,但这会导致错误: ORDID指向我正在使用的表中的字段。如何正确创建序列? 编辑: 据称,MySQL不使用序列。我现在正在使用以下代码,但这也会引起错误。我该如何解决? 编辑: 我想我找到了解决方法。对于phpMyAdmin(我正在使用),您可以使用以下代码。 我不知道为什么它会喜欢这种方式,但
我有一个data.frame包含三个二进制变量的调查数据。数据已经在列联表中,前3列是答案(1=是,0=否),第四列显示答案的总数。行是三个不同的组。 我的目的是计算Z分数,以检查比例与总的相比是否有显著差异 这是我的数据: 这些是我的总价值 所以这里当前使用的参数dftotal$var1和dftotal$totaln不起作用,但我不知道如何将它们输入公式。对于第一个参数,它不能总是var1,而应
这听起来很愚蠢,但我在StackOverflow或Google上都找不到答案。我需要做一件非常简单的事情——将一个每个集合中包含两个数字的数据提供程序传递给我的TestNG测试,但我没有成功。这是我的代码: 我的测试看起来是这样的 当我试图运行它时,我得到下一条错误消息: 数据提供程序公共java.lang.Object[]必须返回Object[][]或Iterator[],而不是类[Ljava.
我找不到在Flutter中创建一个输入字段的方法,可以打开一个数字键盘。这可能与颤振材料小部件?一些github讨论似乎表明这是一个受支持的功能,但我找不到任何关于它的留档。