我最近做了一个严肃的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
中非常冗长的值范围集。你会如何解决这个问题?
答案 0 :(得分:5)
我们似乎错过了这个例子的一部分,因为没有提到“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
答案 1 :(得分:2)
我会简单地使用类似Corbin提到的索引方案,但由于他没有提供示例,这里只是一个简单的方法:
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
答案 2 :(得分:0)
注意:非常类似于Simone的回答,因为我开始有点回来。最后有一张纸条。我给出的索引方法基本上是Simone的答案。
某处必须有一个循环。
我会做的伪代码是:
score = blah
for each raw => t
break raw into rMin -> rMax
if(rMin <= score and rMax >= score)
return t
它避免了在rMin和rMax之间循环遍历每个数字(这是我假设你的意思),但是没有某种索引,这是你将获得的最佳数据。
注意:如果您对此进行了大量调用,并且索引实际上值得您花时间,那么最简单的索引类型就是分数的哈希映射 - &gt; t条目。
基本上,您可以将示例数据解析为:
index[5] = 0
index[6] = 2
index[7] = 3
index[8] = 3
index[9] = 3
如果构建索引比仅仅遍历范围更耗时,则需要仔细权衡。
注意:索引方法实际上是Simone所说的。