我已经得到了一些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
的示例。这类似于一列的各种值。
答案 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