Стандартный способ удаления нескольких элементов из кадра данных - PullRequest
14 голосов
/ 21 сентября 2011

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

m[m$date!="01/31/11",]

Однако, если я пытаюсь что-то вроде

m[m$date!=c("01/31/11","01/30/11"),]

, я получаю предупреждение

Warning message:
In `!=.default`(m$date, c("01/31/11", "01/30/11")) :
longer object length is not a multiple of shorter object length
Calls: [ ... [.data.frame -> Ops.dates -> NextMethod -> Ops.times -> NextMethod

Кажется,работать в течение двух дней, но если я добавлю 29.01.11 в вектор, он показывает все дни, кроме 31.01.11.

Ответы [ 4 ]

35 голосов
/ 21 сентября 2011

nzcoops - это его предложение.Я задал этот вопрос в чате R некоторое время назад, и Пол Тетор предложил определить новую функцию:

`%notin%` <- function(x,y) !(x %in% y) 

, которую затем можно использовать следующим образом:

foo <- letters[1:6]

> foo[foo %notin% c("a", "c", "e")]
[1] "b" "d" "f"

Само собой разумеется,этот маленький драгоценный камень теперь находится в моем R профиле и используется довольно часто.

13 голосов
/ 21 сентября 2011

Я думаю, что вы хотите:

m[!m$date %in% c("01/31/11","01/30/11"),]
2 голосов
/ 11 апреля 2013

Классный способ - использовать функцию Negate для создания новой:

`%ni%` <- Negate(`%in%`) 

, чем вы можете использовать ее для поиска непересекающихся элементов

0 голосов
/ 05 июля 2018

Что касается некоторых из приведенных выше вопросов, вот решение, соответствующее tidyverse. Я использовал anti_join из dplyr для достижения того же эффекта:

library(tidyverse)

numbers <- tibble(numbers = c(1:10))
numbers_to_remove <- tibble(number = c(3, 4, 5))

numbers %>%
  anti_join(numbers_to_remove)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...