我有一个大的data.table,有几百万行。我已经将所有列都转换为因数,并用空字符串(“”)替换了所有NA。我想确定每列中空字符串的数量,最好以内存有效的方式确定。
答案 0 :(得分:1)
不带包装的解决方案是:
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 == ""))
谁是赢家?
我在具有40万行和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
。如果您已经在使用其中一个,则坚持使用即可。
答案 1 :(得分:0)
我们可以使用colSums
中的base R
colSums(df == "")