从R中的data.table中删除带有NA的行[重复]

Posted

技术标签:

【中文标题】从R中的data.table中删除带有NA的行[重复]【英文标题】:Remove rows with NA from data.table in R [duplicate] 【发布时间】:2015-05-06 19:57:13 【问题描述】:

我想删除 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]

来自this *** question。但是,这种方法不能很好地扩展到大量数据。有没有更好的方法来删除带有Inf 的行?

【问题讨论】:

可能是DT[DT[, Reduce('&amp;', lapply(.SD, is.finite))]] 有趣的是 (?),当 @akrun 解决方案有效时,OP 给出的示例不适用于 1.9.5 版。 为什么不使用rowSumsDT[is.finite(rowSums(DT))] 相关:在 data.table ***.com/a/10791729/1191259 中通过引用删除行可能有朝一日是可行的 【参考方案1】:

您可以使用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 

【讨论】:

以上是关于从R中的data.table中删除带有NA的行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在R中删除带有NA的行[重复]

使用“data.table”从重复行中选择非“NA”值——当有多个分组变量时

小技巧-只删除某一列中含NA的行(R)

如何填充(自动填充)值,例如使用 R 中的 data.table 将 NA 替换为组中的第一个值?

R:提取具有NA的行,删除那些满足条件A并取那些满足条件B的平均值

根据R中的2列删除重复的行