Подмножество оставшейся части фрейма данных с использованием другого подмножества

#r #dataframe #subset

#r #фрейм данных #подмножество

Вопрос:

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

 data("mtcars")
fulldf <- mtcars
subdf <- subset.data.frame(fulldf, subset = fulldf$disp < 100)
restdf <- subset.data.frame(fulldf, subset = <fulldf without subdf>)
  

Есть много вопросов по подмножеству фреймов данных в R, но я не смог найти тот, который удовлетворял бы моему требованию.
Также конечное решение не обязательно должно использовать subset.data.frame . Подойдет любой метод / пакет.

Комментарии:

1. Есть хороший способ использовать setdiff из dplyr : dplyr::setdiff(fulldf, subdf)

2. Спасибо, Маркус! Это сделало свое дело!

Ответ №1:

Лучше назначить логическое условие в base R идентификатору объекта, а затем отрицать ( ! )

 i1 <- fulldf$disp < 100
subdf <- subset.data.frame(fulldf, subset = i1)
restdf <- subset.data.frame(fulldf, subset = !i1) 
  

Также другим вариантом является создание list из двух наборов данных с split

 lst1 <- split(fulldf, i1)
  

Если ‘subdf’ создается с несколькими условиями (хотя и не ясно), одним из вариантов является добавление переменной последовательности в данные, а затем подмножество с %in%

 fulldf$ind <- seq_len(nrow(fulldf))
  

затем после шага ‘subdf’

 restdf <- subset(fulldf, !ind %in% subdf$ind)
  

и удалите столбцы ‘ind’

 restdf$ind <- NULL
subdf$ind <- NULL
  

Комментарии:

1. Спасибо, это хорошее решение, но, к сожалению, я создаю subdf с использованием нескольких условий и не могу сохранить его в одной переменной.

2. @snair1591 Разве конечный результат не был бы логическим вектором?

3. Я использую rbind для создания своего subd с использованием нескольких условий, если это поможет.

4. @snair1591 Я добавил другой base R метод. Это также можно сделать, создав условие с помощью row.names , но я думаю, что rbind и другие методы, возможно, изменили имена строк во время процесса

5. @snair1591 Это можно было бы легко решить с помощью пакетов, но я бы использовал внешнюю зависимость только в том случае, если нет другого выбора / эффективности и т.д.