用于问卷评分的类似开关的功能

时间:2011-09-04 23:09:54

标签: r for-loop switch-statement

我最近做了一个严肃的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 个答案:

答案 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所说的。