【问题标题】:Is there an elegant, built-in way to do modulo indexing in R?是否有一种优雅的内置方法可以在 R 中进行模索引?
【发布时间】:2018-04-08 12:16:14
【问题描述】:

目前,我有

extract_modulo = function(x, n, fn=`[`) fn(x, (n-1L) %% length(x) + 1L)
`%[mod%` = function (x, n) extract_modulo(x, n)

然后:

seq(12) %[mod% 14
#[1] 2

这是否已经内置在 R 的某个地方?我会这么认为,因为 R 有几个回收值的函数(例如,paste)。但是,我没有找到 help('[[')??index??mod 的任何内容。例如,我认为 R 表示法类似于 seq(12)[/14/]as.list(seq(12))[[/14/]]

【问题讨论】:

  • oarray 包实现了不同偏移量的数组。
  • 我查看了 oarray 包 documentation,但没有找到我正在寻找的模索引功能。也许我忽略了它。 @G.Grothendieck 或其他用户是否愿意指出我忽略了什么?
  • 我的评论是它实现了偏移量。

标签: r indexing mod built-in


【解决方案1】:

rep_len() 是一个快速的.Internal 函数,适用于此用途或在您自己的函数中回收参数时。对于这种特殊情况,您正在寻找超出向量长度的索引位置的值,rep_len(x, n)[n] 将始终执行您正在寻找的操作,对于任何非负整数“n”和任何非 @ 987654324@x.

rep_len(seq(12), 14)[14]
# [1] 2
rep_len(letters, 125)[125]
# [1] "u"

如果事实证明您不需要回收 x,它同样适用于小于 length(x)n

rep_len(seq(12), 5)[5]
# [1] 5
rep_len(seq(12), 0)[0]
# integer(0)
# as would be expected, there is nothing there

如果您愿意,当然可以创建一个包装器:

recycle_index <- function(x, n) rep_len(x, n)[n]
recycle_index(seq(12), 14)
# [1] 2

【讨论】:

  • 在使用rep_len 进行模索引时,R 似乎实际上创建了相应的向量,这使得该方法随着相应索引的增加而内存效率越来越低。我想这种技术的变体可能会更快(如果它不经常创建和丢弃索引向量),具体取决于应用程序和机器,因为使用查找而不是模除法。
  • 另外:1) 当为 length.out 参数指定负值时,rep_len 失败,2) 当使用 rep_len 技术时,n = 0 的模索引将失败,因为 @987654337 @ 在length.out == 0 时返回integer(0)
猜你喜欢
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 2017-06-11
  • 2011-03-20
  • 1970-01-01
  • 2021-08-14
  • 2015-06-12
相关资源
最近更新 更多