我有一个包含几百万行的大型 data.table。我已将所有列转换为因子并将所有 NA 替换为空字符串 ("")。我想确定每列中空字符串的数量,理想情况下以内存有效的方式。
没有包的解决方案是:
apply(df, 2, function(x) sum(x == ""))
但是,这可能会很慢,您可以利用一些库。
例如,这就是dplyr
解决方案的样子:
library(dplyr)
df %>%
summarise_all(funs(sum(. == "")))
但是,如果您正在处理大型数据帧,您可能会从更快的速度中受益data.table
:
library(data.table)
setDT(df)[, lapply(.SD, function(x) sum(x == ""))]
但我们不要忘记,也可以有一个更精简和更快的tidyverse
解决方案(与 相比dplyr
):
library(purrr)
map_int(df, function(x) sum(x == ""))
谁是这里的赢家?
我在一个有 400 000 行和 26 列的表上做了一个快速基准测试,data.table
平均来说似乎是最快的(单位是毫秒):
expr min lq mean median uq max neval
purrr 56.80567 58.76752 71.99501 64.61143 78.72492 199.9948 100
dplyr 70.65627 73.17036 85.56228 79.73072 93.51717 194.7238 100
base 689.97336 771.03395 830.39465 794.20452 881.38988 1116.8218 100
datatable 57.83673 60.17200 70.97264 64.60314 78.89446 165.2100 100
然而,purrr
并没有真正落后,以不同的方式它也可以超越DT
。如果您已经在使用其中一种,那么坚持下去就可以了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句