如何确定data.table每列中包含空字符串(“”)的行数?

时间:2019-02-09 22:53:56

标签: r

我有一个大的data.table,有几百万行。我已经将所有列都转换为因数,并用空字符串(“”)替换了所有NA。我想确定每列中空字符串的数量,最好以内存有效的方式确定。

2 个答案:

答案 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 == "")