R: Как выполнить многоуровневую оптимизацию по «match-index»? - PullRequest
0 голосов
/ 10 июля 2019

Я работаю над оптимизацией существующего R-сценария, и мне необходимо четко и эффективно выполнить R-эквивалент, эквивалентный Excel 'Index-Index', где тип соответствия == -1 (т. Е. Больше или равен) в 100 000+ раз и затем сохраните каждый результат в столбце в соответствующих строках.

Первоначально скрипт использовал код, который появляется над строкой. То, что у меня есть, отображается под линией.

Хотя цикл for гораздо яснее о том, что происходит (что достигает моей первой цели), он медленнее, чем первый вариант.

Эта ссылка, http://r.789695.n4.nabble.com/Find-the-closest-value-in-a-list-or-matrix-td838131.html
было полезно, но у меня есть пара дополнительных битов, которые делают использование функции apply () немного громоздкой.

Я также изучил использование функции match () {base}, но это не позволяет мне указывать часть «больше или равно». Маловероятно, что когда-либо будет точное совпадение, и мне нужно частичное совпадение.

Я видел несколько методов, где люди объединяют таблицы и т. Д., Но они не подходят для этой ситуации.

tbl <- expand.grid(seq(0, length(table1[ , indx]) - 1), simdata$columntomatch)
tbl$cum <- mc[ , indx]
tbl$prbInd <- sort(rep(its, length(mc[ ,indx])))
tbl$diff <- tbl$cum - tbl$mprob  # diff between cum and prb
tbl$diff[which(tbl$diff < 0)] <- NA # remove negative diff
tbl <- spread(tbl, "prbInd", "diff")
tbl <- group_by(tbl, prbInd)
simdata$mea <- dplyr::summarise(tbl, min = mea(diff, age))$min
...

colnum <- 1
for(r in seq(from = 1, to = itNum, by = 1)) {
      simdata$mcindex[r] <- which.min((mc[ ,colnum] - simdata$mPrb[r]) > 0)  #This is equivalent of Excel's MATCH() function
      simdata$mEndAge[r] <- mc[simdata$mcindex[r], 'Age']#This is equivalent of Excel's INDEX function
    }
colnum <- colnum + 1'
...

Опять оба работают. Первый более быстрый, но менее понятный, возможно, я не единственный, кто использует этот скрипт, и хочу убедиться, что он будет максимально простым для будущих пользователей. Я думаю, что второй более понятен, но намного медленнее. Есть предложения по увеличению скорости?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...