繁体   English   中英

优化大型数据框架上的ifelse

[英]Optimizing ifelse on a large data frame

我有一个数据框df ,如下所示:

A B C 
1 2 3
2 5 6
3 8 9

下面的代码行添加了一个新列并相应地填充数据。

df$Mean.Result1 <- ifelse(df[, "A"] > 0.05 & df[, "B"] > 0.05, "Equal", "")

我使用的R 2与Splunk的 ,和R Splunk的是不能够认识到,上述格式。

这样做是对的:

df.$Mean.Result1 <- ifelse(df.$A > 0.05 & df$B > 0.05, "Equal", "")

这两段代码有何不同? 它会影响计算速度吗? 我的实际数据集有大约5亿行和400列。

目前已经有了一些讨论有关如何ifelse不是代码的最佳选项,其中速度是一个重要因素。 您可以尝试:

df$Mean.Result1 <- c("", "Equal")[(df$A > 0.05 & df$B > 0.05)+1]

要看看这里发生了什么,让我们分解命令。 df$A > 0.05 & df$B > 0.05如果AB超过0.05则返回TRUE否则返回FALSE 因此, (df$A > 0.05 & df$B > 0.05)+1如果AB超过0.05则(df$A > 0.05 & df$B > 0.05)+1返回2,否则返回1。 这些用作向量c("", "Equal")指示,因此当两者都超过0.05时我们得到"Equal" ,否则得到""

以下是对100万行数据框的比较:

# Build dataset and functions
set.seed(144)
big.df <- data.frame(A = runif(1000000), B = runif(1000000))
OP <- function(df) {
  df$Mean.Result1 <- ifelse(df$A > 0.05 & df$B > 0.05, "Equal", "")
  df
}
josilber <- function(df) {
  df$Mean.Result1 <- c("", "Equal")[(df$A > 0.05 & df$B > 0.05)+1]
  df
}
all.equal(OP(big.df), josilber(big.df))
# [1] TRUE

# Benchmark
library(microbenchmark)
microbenchmark(OP(big.df), josilber(big.df))
# Unit: milliseconds
#              expr      min        lq      mean    median        uq      max neval
#        OP(big.df) 299.6265 311.56167 352.26841 318.51825 348.09461 540.0971   100
#  josilber(big.df)  40.4256  48.66967  60.72864  53.18471  59.72079 267.3886   100

使用向量索引的方法在中值运行时间中快约6倍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM