Как использовать i в data.tables для выбора строк всех столбцов на основе условного - PullRequest
1 голос
/ 06 мая 2020

У меня есть набор данных с более чем 400 столбцами, и я пытаюсь выяснить, в каких строках есть все NA для всех столбцов. Невозможно записать имена всех столбцов в структуре data.table, т.е.

data[is.na(colA) & is.na(colB) ... ]

Есть ли способ сделать это легко для всех столбцов? Вот набор данных игрушек, в котором одна строка содержит все NA, а другая - 1. Как лучше всего вернуть строку, содержащую все NA? Есть ли аналогичный способ вернуть строки со всеми 1 с? Спасибо!

> toy <- data.table(cbind(A1 = c(1,5,6,NA,1),
+                         B1 = c(1,NA,4,NA,0),
+                         C1 = c(1,1,6,NA,10),
+                         D1 = c(1,NA,4,NA,5),
+                         E1 = c(1,2,11,NA,8)))
> toy
   A1 B1 C1 D1 E1
1:  1  1  1  1  1
2:  5 NA  1 NA  2
3:  6  4  6  4 11
4: NA NA NA NA NA
5:  1  0 10  5  8
> # the goal
> toy[1]
   A1 B1 C1 D1 E1
1:  1  1  1  1  1
> toy[4]
   A1 B1 C1 D1 E1
1: NA NA NA NA NA

Ответы [ 2 ]

3 голосов
/ 06 мая 2020

Буквальная реализация:

toy[rowSums(sapply(toy, is.na)) == ncol(toy), ]
#    A1 B1 C1 D1 E1
# 1: NA NA NA NA NA

toy[rowSums(toy == 1) == ncol(toy),]
#    A1 B1 C1 D1 E1
# 1:  1  1  1  1  1

Небольшое улучшение, удаление вызова ncol(toy), хотя я подозреваю, что вера в то, что это даст улучшение скорости, - это принятие желаемого за действительное:

toy[rowSums(sapply(toy, Negate(is.na))) == 0, ]
toy[rowSums(toy != 1) == 0,]
1 голос
/ 06 мая 2020

Вот вариант с Reduce

library(data.table)
toy[toy[, Reduce(`&`, lapply(.SD, is.na))]]
#   A1 B1 C1 D1 E1
#1: NA NA NA NA NA

toy[toy[, Reduce(`&`, lapply(.SD, `==`, 1))]]
#    A1 B1 C1 D1 E1
# 1:  1  1  1  1  1
...