R语言 删除向量元素包含嵌套NA的data.table行

ymzxtsji  于 2023-01-03  发布在  其他
关注(0)|答案(2)|浏览(131)

我需要从data.table中删除列a包含嵌套在向量中的任何NA的任何行:

library(data.table)

a = list(as.numeric(c(NA,NA)), 2,as.numeric(c(3, NA)), c(4,5) )
b <- 11:14

dt <- data.table(a,b)

因此,应删除第1行和第3行。
我尝试了三种解决方案都没有成功:

dt1 <- dt[!is.na(a)] 
dt2 <- dt[!is.na(unlist(a))]
dt3 <- dt[dt[,!Reduce(`&`, lapply(a, is.na))]]

有什么主意吗?谢谢。

t2a7ltrp

t2a7ltrp1#

您可以执行以下操作:

dt[sapply(dt$a, \(l) !any(is.na(l)))]

此替代方法也有效,但会收到警告

dt[sapply(dt$a, all)]

更好的方法(感谢R2evans,参见评论)

dt[!sapply(a,anyNA)]

输出:

a  b
1:   2 12
2: 4,5 14

第三个选项,你可能会喜欢:您可以将该功能移到一个单独的helper函数中,该函数接收一个列表列表(nl),并返回一个长度等于length(nl)的布尔向量,然后按如下所示应用该函数:在本例中,我显式地对lapply()的结果调用unlist(),而不是让sapply()为我执行此操作,但我也可以使用sapply()

f <- \(nl) unlist(lapply(nl,\(l) !any(is.na(l))))

dt[f(a)]
o7jaxewo

o7jaxewo2#

  • apply()的替代方法
dt[, .SD[!anyNA(a, TRUE)], by = .I][, !"I"]

#         a     b
#    <list> <int>
# 1:      2    12
# 2:    4,5    14

相关问题