выбор столбцов по colSums и фильтрация по rowSums в data.table - PullRequest
1 голос
/ 13 апреля 2020
library(data.table)
a <- mtcars
setDT(a)
b <- a[,colSums(.SD)>500,.SDcols=setdiff(names(a),c("vs","am"))]

В этом надуманном примере я хотел бы выбрать столбцы, удовлетворяющие условию colSums, без использования столбцов vs и am. Приведенный выше код просто приводит к логическому вектору правильных столбцов, но без фактического выбора целых столбцов в новом dt. Более того, решение setdiff для .SDcols кажется довольно кратким и многословным. Есть ли более эффективный синтаксис / succint для этого - я пытался использовать .SDcols = - c ("vs", "am"), чтобы не помочь?

1 Ответ

1 голос
/ 13 апреля 2020

Мы можем использовать .SD, чтобы выбрать столбцы на основе логического вектора

library(data.table)
a[, .SD[, colSums(.SD)>500, with = FALSE],.SDcols=setdiff(names(a),c("vs","am"))]

Если мы хотим сделать rowSums, просто используйте это как индекс

d <- a[, .SD[rowSums(.SD)>300],.SDcols=-c(8,9)]

Или с Reduce

 a[, .SD[Reduce(`+`, .SD) > 300], .SDcols = -c(8, 9)]

Если нам нужно получить все столбцы, используйте .I вместо .SD

a[a[, .I[Reduce(`+`, .SD) > 300], .SDcols = -c(8, 9)]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...