我正在尝试解决一个问题,其中有一个长长的列表,每个索引处都有数量不定的数字。目的是说每个数字出现的最早索引是什么。因此,如果15在列表中的索引45和78处出现,那么我应该返回15在48处的第一个位置。在最初的问题中,它继续使用长度为10,000的列表,因此快速执行此操作很有帮助。
最初,我尝试使用现有的列表结构,并做了类似的事情,它在10,000行时非常慢。
set.seed(1)
x <- replicate(100, sample(100, sample(10, 1)))
cbind(value = 1:100,
index = sapply(1:100, function(i) which.max(sapply(x, function(x) i %in% x))))
Run Code Online (Sandbox Code Playgroud)
最终,我尝试将数据转换为data.table,效果更好,但是我一直想知道是否有更好的方法来解决问题。就像默认列表结构本质上效率低下一样,还是有更好的方法可以使用它?
set.seed(1)
x <- replicate(100, sample(100, sample(10, 1)))
dt <- data.table(index = rep(1:100, sapply(x, length)), value = unlist(x))
dt[,.(index = first(index)),value][order(value)]
Run Code Online (Sandbox Code Playgroud)
如果有帮助,这里是原始问题的完整数据集。
library(RcppAlgos)
library(memoise)
library(data.table)
jgo <- function(n) {
if (isPrimeRcpp(n) | n == 1) return (n)
div <- divisorsRcpp(n)
div <- div[-c(1, length(div))]
div <- Map(function(a, b) c(a, b), div, rev(div))
div2 <- lapply(div, function(x) lapply(jgo(x[1]), c, x[2])) …Run Code Online (Sandbox Code Playgroud) r ×1