从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('&', lapply(.SD, is.finite))]]
有趣的是 (?),当 @akrun 解决方案有效时,OP 给出的示例不适用于 1.9.5 版。
为什么不使用rowSums
:DT[is.finite(rowSums(DT))]
相关:在 data.table
***.com/a/10791729/1191259 中通过引用删除行可能有朝一日是可行的
【参考方案1】:
您可以使用rowSums
检查行的任何元素是否不是有限的。
DT[is.finite(rowSums(DT))]
或者您可以使用Inf * 0
是NA
的事实并使用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的行[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用“data.table”从重复行中选择非“NA”值——当有多个分组变量时
如何填充(自动填充)值,例如使用 R 中的 data.table 将 NA 替换为组中的第一个值?