我最近做了一个严肃的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中非常长的一组值范围。你将如何解决这个问题?
发布于 2011-09-05 07:40:13
我们似乎遗漏了示例的一部分,因为没有提到"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发布于 2011-09-05 07:46:58
我会简单地使用类似于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发布于 2011-09-05 07:25:10
注意:与Simone的答案非常相似,因为我刚才开始输入这段代码。不过在结尾有个注解。我给出的索引方法本质上就是Simone的答案。
一定会有一个循环涉及到某个地方。
我要做的伪代码是这样的:
score = blah
for each raw => t
break raw into rMin -> rMax
if(rMin <= score and rMax >= score)
return t它避免了循环遍历rMin和rMax之间的每个数字(我假设您指的就是这个意思),但如果没有某种索引,这就是最好的结果。
注意:如果您对此有大量的调用,并且索引实际上是值得的,那么最简单的索引类型就是score -> t条目的哈希图。
基本上,您可以将示例数据解析为以下内容:
index[5] = 0
index[6] = 2
index[7] = 3
index[8] = 3
index[9] = 3您需要仔细权衡构建索引是否比仅在范围内循环更耗时。
注:索引方法实际上就是Simone所说的。
https://stackoverflow.com/questions/7302695
复制相似问题