如何定义超出范围的data.frame的值为NA?

时间:2015-12-07 10:48:18

标签: r optimization

我目前正在尝试创建一个帮助我清理数据集的例程。对于某些数字/整数变量,存在允许值的范围(最小值和最大值)。未包含在该范围内的值应声明为NA。

我目前的代码:

df$variable[df$variable < min.range && df$variable > max.range] <- NA

或作为替代方案:

df$variable[!df$variable %in% c(min.range:max.range)] <- NA

我想知道哪一个会更高效,因为数据集可能非常大,我希望尽可能缩短处理时间。也许甚至有更好的方法来解决问题。 提前谢谢!

2 个答案:

答案 0 :(得分:2)

你的第一种做法有两个原因:

  • 首先,值不能是< min.range> max.range,您需要or

  • 其次,您不需要只检查第一个值的双&|

因此,您需要通过以下方式替换第一行代码:

df$variable[df$variable < min.range | df$variable > max.range] <- NA  

对于第二种方式,它只能用整数。

关于效率,您可以使用相对较大的data.frame测试两种方式:

set.seed(123)
df <- data.frame(matrix(floor(rnorm(50000*1000, 100, 10)), nrow=50000))
colnames(df)[1] <- "variable"
min.range <- 85
max.range <- 115
meth1 <- function(){df$variable[df$variable < min.range | df$variable > max.range] <- NA; df}
meth2 <- function(){df$variable[!df$variable %in% c(min.range:max.range)] <- NA; df}

library(microbenchmark)
microbenchmark(meth1(), meth2(), unit="relative")
#   expr      min       lq     mean   median       uq      max neval cld
# meth1() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000   100  a 
# meth2() 1.588484 1.603514 1.581301 1.597115 1.564948 1.481916   100   b

总结:
- 如果要使其工作,请修改您的第一种方法 - 如果您不使用整数,请不要使用第二个 - 即使你正在使用整数,第一种方法也更有效率

答案 1 :(得分:1)

您可以像这样获得替代品的执行时间:

#processing time of option 1
system.time({ 
 df$variable[df$variable < min.range && df$variable > max.range] <- NA
}) 

#processing time of option 2
system.time({ 
 df$variable[!df$variable %in% c(min.range:max.range)] <- NA
}) 

(不要忘记在两次测试之间重新初始化df