在R中的data.table中删除包含NA的行

8

我想要删除所有包含 data.table 的行中任意一列包含 Inf 的内容。目前,我使用以下方法:

DT <- data.table(col1 = c(1,2,3), col2 = c(4,Inf,5))
DT[,drop := apply(.SD, 1, function(x) any(is.infinite(x))), by = 1:nrow(DT)]
DT <- DT[(!drop)][,drop:=NULL]

这是来自Stackoverflow问题的内容。然而,对于大量数据,这种方法并不可扩展。是否有更好的方法来删除具有Inf的行?


2
可能是 DT[DT[, Reduce('&', lapply(.SD, is.finite))]] - akrun
有趣的是,原帖中提供的示例在1.9.5版本上不起作用,而@akrun的解决方案有效。 - user3710546
3
дёәд»Җд№ҲдёҚдҪҝз”ЁrowSums: DT[is.finite(rowSums(DT))]пјҹиҜ·жіЁж„ҸпјҢиҝҷжҳҜдёҖжқЎиӢұж–ҮеҸҘеӯҗпјҢдёҚжҳҜйңҖиҰҒзҝ»иҜ‘зҡ„еҶ…е®№гҖӮ - shadow
相关:在data.table中通过引用删除行可能有一天会实现 https://dev59.com/Fmgv5IYBdhLWcg3wMN0U#10791729 - Frank
1个回答

18
您可以使用 rowSums 来检查行中的任何元素是否不是有限的。
DT[is.finite(rowSums(DT))]

或者您可以利用 Inf * 0NA 的事实,然后使用 complete.cases

DT[complete.cases(DT*0)]

一些基准测试表明,在数据集较小的情况下,rowSums 是最快的解决方案,而在数据集较大的情况下,complete.cases 是最快的解决方案。

require(microbenchmark)
microbenchmark(
  DT[is.finite(rowSums(DT))]
  ,
  DT[complete.cases(DT*0)]
  ,
  DT[DT[, Reduce('&', lapply(.SD, is.finite))]]
)
##
## nrow(DT) = 3000
## Unit: microseconds                                          
##                                          expr       min       lq      mean    median       uq      max neval cld
##                     DT[is.finite(rowSums(DT))]  786.797  839.235  864.0215  852.8465  884.756 1021.988   100 a  
##                     DT[complete.cases(DT * 0)] 1265.658 1326.575 1363.3985 1350.0055 1386.377 1898.040   100   c
##  DT[DT[, Reduce("&", lapply(.SD, is.finite))]] 1220.137 1275.030 1319.6226 1308.0555 1348.443 1624.023   100  b 
##
## nrow(DT) = 300000
## Unit: milliseconds
##                                           expr       min        lq      mean   median       uq      max neval cld
##                     DT[is.finite(rowSums(DT))] 21.617935 22.687452 26.698070 25.75765 26.07942 87.56290   100   c
##                     DT[complete.cases(DT * 0)]  7.209252  7.567393  9.908503 10.17569 10.37473 71.31375   100 a  
##  DT[DT[, Reduce("&", lapply(.SD, is.finite))]] 11.786773 12.647652 14.128624 14.78512 15.05089 15.39542   100  b 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接