优化大型数据框架上的ifelse

时间:2015-10-05 17:28:07

标签: r if-statement dataframe subset splunk

我的数据框 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与Splunk Splunk 中的 R 无法识别上述格式

是否正确:

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

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

1 个答案:

答案 0 :(得分:3)

ifelse关于df$Mean.Result1 <- c("", "Equal")[(df$A > 0.05 & df$B > 0.05)+1] 如何不是速度是重要因素的代码的最佳选择。您可以尝试:

df$A > 0.05 & df$B > 0.05

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

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

position: fixed;

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