我目前正在尝试创建一个帮助我清理数据集的例程。对于某些数字/整数变量,存在允许值的范围(最小值和最大值)。未包含在该范围内的值应声明为NA。
我目前的代码:
df$variable[df$variable < min.range && df$variable > max.range] <- NA
或作为替代方案:
df$variable[!df$variable %in% c(min.range:max.range)] <- NA
我想知道哪一个会更高效,因为数据集可能非常大,我希望尽可能缩短处理时间。也许甚至有更好的方法来解决问题。 提前谢谢!
答案 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
)