R 基于变量组中的值筛选data.table

R 基于变量组中的值筛选data.table,r,data.table,R,Data.table,我遇到了一个问题,无法找到最佳语法来过滤掉我想要过滤一组变量至少有一个非null值的所有行的情况 一个例子如下: > dat <- data.table(a=1:5, b=c(1:3, NA, NA), c=c(NA, 1:3, NA)) > cols <- c('b', 'c') > dat[!all(is.na(cols)), .SD, with=FALSE] Null data.table (0 rows and 0 cols) > dat[!is

我遇到了一个问题,无法找到最佳语法来过滤掉我想要过滤一组变量至少有一个非null值的所有行的情况

一个例子如下:

> dat <- data.table(a=1:5, b=c(1:3, NA, NA), c=c(NA, 1:3, NA))

> cols <- c('b', 'c')

> dat[!all(is.na(cols)), .SD, with=FALSE]
Null data.table (0 rows and 0 cols)

> dat[!is.na(b)|!is.na(c), .SD]
   a  b  c
1: 1  1 NA
2: 2  2  1
3: 3  3  2
4: 4 NA  3
>dat cols dat[!all(is.na(cols)),.SD,with=FALSE]
Null data.table(0行和0列)
>数据[!is.na(b)|!is.na(c),.SD]
a、b、c
1:11 NA
2: 2  2  1
3: 3  3  2
4:4-3

如您所见,如果我明确地将每个变量名称为
!is.na(可变1)|!is.na(variable2)
它可以工作,但是我找不到包含一组变量的方法,因此我只能在1个条件下执行,而不能将所有内容与
连接起来
您可以使用以下语法与
行和
.SD

dat[dat[, rowSums(!is.na(.SD)) > 0, .SDcols  = cols]]
#   a  b  c
#1: 1  1 NA
#2: 2  2  1
#3: 3  3  2
#4: 4 NA  3
内部部分创建如下所示的逻辑值:

dat[, rowSums(!is.na(.SD)) > 0, .SDcols  = cols]
# [1]  TRUE  TRUE  TRUE  TRUE FALSE
对于Michael的评论,您也可以使用
Reduce
+
lappy

dat[dat[, Reduce("+", lapply(.SD, function(x) !is.na(x))) > 0, .SDcols = cols]]

但是对于我的大多数用例来说,
rowSums
方法还可以,而且更容易阅读,我认为。

您也可以这样做

dat[rowSums(!is.na(dat[, cols, with=FALSE])) > 0,]
    a  b  c
#1: 1  1 NA
#2: 2  2  1
#3: 3  3  2
#4: 4 NA  3

工作正常,但矩阵转换在大数据上非常昂贵。有一个Reduce方法,但我可以进行测试。类似于
do.call(`+`,lappy(.SD,is.na))
的方法也可以很好地工作,这不能满足OP使用相关列名向量(“col”)的要求。