干燥常见的R代码模式

时间:2015-07-14 05:59:48

标签: r

我已经得到了一些r代码中相当常见的模式。我有一个带有数字向量的数据框,我想根据数字向量的特定值创建另一个因子变量。

目前这是我的代码:

add_category <- function(sample) {
   sample$category <- NA
   sample$category[sample$numeric_vars < 25000] <- '1. Below 25k'
   sample$category[sample$numeric_vars >= 25000] <- '2. Above 25k'
   sample$category[sample$numeric_vars >= 50000] <- '3. Above 50k'
   sample$category <- as.factor(sample$category)
   return(sample)
}

我遇到的问题是这段代码有一堆重复,我无法轻易测试。我一直试图找到一种方法来减少重复次数,但是我几个小时都没碰到它而没有太大的成功。

所以我的问题是,你如何在基础R中以干燥的方式复制这种模式?

修改

所以为了让这一点更加清晰,我知道我可以使用cut来解决这个特殊问题。我对解决这类问题的策略更感兴趣,根据对另一个变量的特定实例的一些测试重新编码一个单独的变量。

在Hadley的高级R的函数式编程部分,他使用了在多个列中将-99重新编码为NA的示例。这类似于一列的各种值。

2 个答案:

答案 0 :(得分:1)

我可以剃掉几行。否则它看起来很好。

add_category <- function(sample) {
    sample$category <- '1. Below 25k'
    sample$category[sample$numeric_vars >= 25000] <- '2. Above 25k'
    sample$category[sample$numeric_vars >= 50000] <- '3. Above 50k'
    return(sample)
}

它应该已经成为因素了。

答案 1 :(得分:1)

只有几个级别,就像在这种情况下,手动执行它仍然是合理的。

df <- data.frame(numeric.var = runif(100000,0,75000))
add_Cat <- function(var) {
  as.factor(ifelse(var > 50000, "3. Above 50k",
    ifelse(var > 25000, "2. Above 25k", "1. Below 25k'")))
}

如果你感兴趣的话,我有一个更通用的解决方案,但是为了得到DRY,它会给KISS发誓。

实际上我撤回了这个答案,需要在运行以下基准后重新考虑我的代码:

microbenchmark(add_Cat(df), add_category(df))
Unit: microseconds
            expr       min         lq       mean    median         uq        max neval
     add_Cat(df) 69179.970 70801.9170 72700.5511 71881.748 72627.1110 144267.491   100
add_category(df)   690.199   728.6855   894.3915   778.535   803.2765   2717.907   100