Basic R: Подстановка DF по столбцам с логическим вектором - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть фрейм данных, trainSmall, с шестью столбцами.

> trainSmall
     chr      pos      end LCR gc.50  type
  1:  22 39491638 39491639   0     0 del_L
  2:  22 29434028 29434029   0     0   ins
  3:  22 28347247 28347248   0     0 del_R
  4:  22 40121931 40121932   0     0   ins
  5:  22 39122351 39122352   0     0 del_L
 ---                                      
768:  22 27869380 27869381   0     0 del_R
769:  22 28823159 28823160   0     0   ins
770:  22 24319557 24319558   0     0 del_R
771:  22 38570330 38570331   0     0 del_L
772:  22 48182139 48182140   0     0 del_L
> is.data.frame(trainSmall)
[1] TRUE

У меня также есть вектор, excl, с четырьмя предметами.

> excl
[1] "chr"  "pos"  "end"  "type"

Я хотел бы взять все строки trainSmall, но только столбцы , а не в excl. Поэтому я попытался

> trainSmall[, !colnames(trainSmall) %in% excl]
[1] FALSE FALSE FALSE  TRUE  TRUE FALSE

Но это просто дает мне другой логический вектор, а не фактические строки из фрейма данных.

Даже делаю

> trainSmall[, c(F,F,F,T,T,F)]
[1] FALSE FALSE FALSE  TRUE  TRUE FALSE

не работает, как я ожидал.

Я довольно сбит с толку, потому что, похоже, во многих местах этот метод используется (например, этот ответ ) для поднабора фрейма данных. Что я делаю не так?

Ответ на возможный повторяющийся флаг : Ни одно из решений там не работает в этом случае.

> trainSmall[, -which(names(trainSmall) %in% excl)]
[1] -1 -2 -3 -6
> trainSmall[ , !names(trainSmall) %in% excl]
[1] FALSE FALSE FALSE  TRUE  TRUE FALSE

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Учитывая вывод вашего кода, я думаю, что ваши данные в формате data.table (таблица данных имеет как фрейм данных, так и таблицу данных в качестве своего класса). Итак, это должно работать:

trainSmall[, !excl, with = FALSE]
0 голосов
/ 29 апреля 2018

Вы можете пойти (обратите внимание на круглые скобки):

df[, !(colnames(df) %in% excl)]

Другим забавным способом было бы сделать оператора самостоятельно (в противоположность %in%):

excl <- c("chr", "pos", "end", "type")

'%!in%' <- function(x,y)!('%in%'(x,y))
mask <- colnames(df) %!in% excl
df[,mask]

Оба будут давать

   LCR gc.50
1:   0     0
2:   0     0
3:   0     0
4:   0     0
5:   0     0
...