当前位置: 首页 > 知识库问答 >
问题:

创建一个数字序列

佟翰林
2023-03-14

我想通过使用rep或任何其他函数在R中制作以下序列。

c(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)

共有3个答案

苍志文
2023-03-14

你提到的rep让我想起了复制,所以这里有一个非常有状态的解决方案。我展示这个是因为它短而不寻常,而不是因为它好。这是非常均匀的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

您可以将replappy组合使用,但基本上与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
缪朝
2023-03-14
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的情况下,我们看到矩阵与其他方法相比变得非常缓慢。在apply中使用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
卫飞
2023-03-14

使用序列

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()[…]从]获取参数[例如,以生成更复杂的序列。

 类似资料:
  • 问题 你想由数组创建一个字符串。 解决方案 使用 JavaScript 的数组方法 toString(): ["one", "two", "three"].toString() # => 'one,two,three' 讨论 toString() 是一个标准的 JavaScript 方法。不要忘记圆括号。

  • 本文向大家介绍R创建一个数据表,包括了R创建一个数据表的使用技巧和注意事项,需要的朋友参考一下 示例 Adata.table是data.frame从R开始的类的增强版本。同样,它的class()属性是向量"data.table" "data.frame",在a上起作用的函数也data.frame将与data.table一起工作。有很多方法可以创建,加载或强制执行data.table。 建立 不要忘

  • 问题内容: 我想要创建一个arraylist数组,如下所示: 但是它没有编译。我怎样才能做到这一点? 问题答案: 根据Oracle文档: “你不能创建参数化类型的数组” 相反,你可以执行以下操作: 正如汤姆·霍廷(Tom Hawting)的建议-定位线一样,最好这样做:

  • 灵感来源于如何在R?中创建数字序列的帖子 问题: 我想在NumPy中制作以下序列。 我尝试了以下方法: Non-generic and hard coding using 上面的解决方案是通用的,但我想知道是否有更有效的方法在NumPy中实现。

  • 我想通过使用或任何其他函数在R中创建以下序列。 基本上,。

  • 问题内容: 我试图扩展到符合以创建的类型。最后,我希望有这样的东西可以打印整个字母: 目前,我正在使用类型来计算两个字符之间的距离。因为类型无法使用标量,所以我需要根据Character创建一个String,获取第一个标量的值,然后计算它们之间的距离: 即使这样,我仍然得到不符合协议和的错误。编译器似乎没有选择随附的关联类型: 我想念什么? 问题答案: 如前所述,由于a 可以由多个unicode标