Переключатель как функция для оценки анкет - PullRequest
3 голосов
/ 05 сентября 2011

Недавно я сделал серьезное PHP / JS-кодирование, и я как бы потерял мышцу R. Хотя эта проблема может быть легко решена в PHP / JS, каков наиболее эффективный способ ее решения: мне нужно оценить анкету, и у меня есть следующий сценарий:

raw    t
5      0
6      2
7-9    3
10-12  4
15-20  5

, если x равно или находится в пределах диапазона, указанного в raw, должно быть возвращено значение в соответствующей строке в t. Конечно, это можно сделать с помощью цикла for или switch, но представьте себе очень длинный набор диапазонов значений в raw. Как бы вы занялись этим?

Ответы [ 3 ]

5 голосов
/ 05 сентября 2011

Кажется, нам не хватает части примера, потому что нигде не упоминается "x"

dat <- read.table(textConnection("raw    t
 5      0
 6      2
 7-9    3
 10-12  4
 15-20  5"), header=TRUE, stringsAsFactors=FALSE)
dat$bot <- as.numeric( sapply( sapply(dat$raw, strsplit, "-"), "[", 1 ))
get.t <- function(x) findInterval(x, dat$bot)
 get.t(8)
#[1] 3
> dat$t[get.t(6)]
[1] 2
> dat$t[get.t(5)]
[1] 0
2 голосов
/ 05 сентября 2011

Я бы просто использовал схему индексации, подобную той, на которую ссылался Корбин, но поскольку он не привел пример, вот простой:

m <- cbind(c(5:12,15:20),
           rep(c(0,2,3,4,5),times = c(1,1,3,3,6)))

m[m[,1] == 11,2]
[1] 4
0 голосов
/ 05 сентября 2011

Примечание: очень похоже на ответ Симоне, когда я начал набирать его немного назад.Имеет записку в конце, хотя.Подход к индексированию, который я даю, по сути является ответом Симоны.

Где-то должен быть задействован цикл.

Псевдокод того, что я бы сделал, выглядит примерно так:

score = blah

for each raw => t
    break raw into rMin -> rMax
    if(rMin <= score and rMax >= score)
        return t

Это избавляет от необходимости циклически перебирать каждое число между rMin и rMax (что я и имел в виду), но без какой-либо индексации это лучшее, что вы получите.

Примечание: если у вас есть тонна обращений к этому, и индексирование действительно стоило бы вашего времени, самый простой тип индексации - это просто хэш-карта оценки -> t записей.

По сути, вы бы проанализироваливаш пример данных выглядит примерно так:

index[5] = 0
index[6] = 2
index[7] = 3
index[8] = 3
index[9] = 3

Вам необходимо тщательно взвесить, если построение индекса будет занимать больше времени, чем просто циклическая обработка диапазонов.

Примечание: подход к индексированиюна самом деле то, что сказала Симона.

...