【问题标题】:Switch-like function for questionnaire grading类似开关的问卷评分功能
【发布时间】:2011-09-04 23:09:53
【问题描述】:

我最近完成了一个严肃的 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 中的一组非常长的值范围。你会如何解决这个问题?

【问题讨论】:

    标签: r for-loop switch-statement


    【解决方案1】:

    我们似乎遗漏了示例的一部分,因为没有提到“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
    

    【讨论】:

    • S-U-B-L-I-M-E!谢谢加糖! =)
    • findIntervalmatch 在实现无循环代码的过程中非常方便。
    • 感谢您指点findInterval。我不知道有这样的功能...... O_o
    • +1 表示 findInterval。这个功能很性感,而且速度很快。
    • get.t 函数不应该是这样的:get.t &lt;- function(x) dat$t[findInterval(x, dat$bot)]。否则 get.t(5) 产生 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
    

    【讨论】:

    • 您的答案确实很简单,但无法扩展到多个raw 列,这是问卷评分中的常见情况。 +1 为简单起见,但@DWin 赢得了这个。 =)
    • @aL3xa 我同意;我的主要目的是为将来发现这个问题但不太关心缩放的人们提供一个例子。
    • 是的,我忘了强调一个事实,即不欢迎非 R 解决方案。 =)
    【解决方案3】:

    注意:与 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 所说的。

    【讨论】:

      猜你喜欢
      • 2011-02-28
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 2018-10-27
      • 2011-08-02
      • 1970-01-01
      相关资源
      最近更新 更多