R 基于变量组中的值筛选data.table
我遇到了一个问题,无法找到最佳语法来过滤掉我想要过滤一组变量至少有一个非null值的所有行的情况 一个例子如下: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
> 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”)的要求。