Как отфильтровать кадр данных по строкам без потери индекса (или номера строки)? - PullRequest
1 голос
/ 14 апреля 2020

У меня есть небольшой фрейм данных (dt), содержащий двоичные метки от отдельных запусков catboost:

structure(list(old.cat.lab = c(1, 1, 0, 0, 0, 1, 0, 0, 0, 1), 
new.cat.lab = c(1, 1, 0, 0, 1, 1, 0, 1, 0, 1)), row.names = c(NA, 10L), class = "data.frame")

Я хочу отфильтровать строки, где dt$new.cat.lab == 1 используя (из пакета dplyr):

dt.match <- dt %>% filter(dt$new.cat.lab ==1, .preserve = T)

Проблема в том, что функция фильтра назначает новый номер строки. Я хотел бы сохранить номера строк (индекс) в новой переменной. Команда .preserve=T в функции фильтра dplyr, похоже, этого не делает.

1 Ответ

2 голосов
/ 14 апреля 2020

tidyverse, не сохраняет имена строк, мы можем создать новый столбец имен строк и затем применить filter

library(dplyr)
library(tibble)
dt %>%
   rownames_to_column('rn') %>%
   filter(new.cat.lab ==1)%>%
   column_to_rownames('rn')
#   old.cat.lab new.cat.lab
#1            1           1
#2            1           1
#5            0           1
#6            1           1
#8            0           1
#10           1           1

Согласно ?dplyr::filter, .preserve предназначен для структуры группировки

.preserve - актуально, когда ввод данных .data группируется. Если .preserve = FALSE (по умолчанию), структура группировки пересчитывается на основе полученных данных, в противном случае группировка сохраняется как есть.


В base R это можно сделать с subset

subset(dt, new.cat.lab == 1)

Или используйте as.logical

subset(dt, as.logical(new.cat.lab))
...