目前,我正在研究一个大数据集。在此任务中,我唯一要做的就是预处理数据。
当我运行我的代码时,我看到我的计算机内存通过这一行增加得非常快:
binary <- ifelse(subset_variables1 == "0", 0, 1)
该行唯一应该做的就是将我的所有值设为二进制。这可以以更快的方式完成吗?或者这已经是一个好方法(我必须处理内存问题)。
最佳答案
使用 bool 类型和/或条件时,您可以将它们与数学运算符一起使用,它们将被解释为 1
或 0
(对于 TRUE
和 FALSE
)。所以 +("0" == 0)
返回 1
, 1 - ("0" == 0)
返回 0
。
如果你有这样的向量
set.seed(666)
subset_variables1 <- sample(c("0", "1"), 10000, replace = TRUE)
您可以使用
1 - (subset_variables1 == "0")
来获得所需的结果。我将它与评论中的一些建议进行了比较,它是最快的。
library(microbenchmark)
microbenchmark(ifelse = ifelse(subset_variables1 == "0", 0, 1),
as.numeric = as.numeric(subset_variables1),
if_else = dplyr::if_else(subset_variables1 == "0", 0, 1),
plus = 1 - (subset_variables1 == "0"),
times = 1000
)
Unit: microseconds
expr min lq mean median uq max neval
ifelse 686.668 701.3440 977.0863 910.6570 1170.816 3222.192 1000
as.numeric 631.813 642.5910 715.8687 677.3830 720.841 1819.925 1000
if_else 347.409 377.0665 537.3344 482.7055 657.468 1603.241 1000
plus 97.170 98.8845 129.9091 107.8545 146.303 741.557 1000
关于r - 以更快的方式编写 ifelse()(内存更少),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48542206/