Subset dataframe несколькими логическими условиями строк для удаления

Я хотел бы подмножить (фильтровать) фрейм данных, указав, какие строки не ( ! ) Сохранить в новом фреймворке данных. Вот упрощенная выборка:

 data v1 v2 v3 v4 avdc avdd bnpg bddhckdccrpg dvdx dvdc evdb evdc 

Например, если строка столбца v1 имеет «b», «d» или «e», я хочу избавиться от этой строки наблюдений, создав следующий блок данных:

 v1 v2 v3 v4 avdc avdd ckdccrpg 

Я был успешным в подмножестве, основанном на одном условии за раз. Например, здесь я удаляю строки, где v1 содержит «b»:

 sub.data <- data[data[ , 1] != "b", ] 

Однако у меня много таких условий, поэтому делать это по одному не желательно. Я не добился успеха в следующем:

 sub.data <- data[data[ , 1] != c("b", "d", "e") 

или

 sub.data <- subset(data, data[ , 1] != c("b", "d", "e")) 

Я пробовал и другие вещи, например, !%in% , но это, похоже, не существует. Есть идеи?

! должно быть вокруг внешней стороны заявления:

 data[!(data$v1 %in% c("b", "d", "e")), ] v1 v2 v3 v4 1 avdc 2 avdd 5 ckdc 6 crpg 

Попробуй это

 subset(data, !(v1 %in% c("b","d","e"))) 

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

 subset(my.df, my.df$v1 != "b" & my.df$v1 != "d" & my.df$v1 != "e") 

Это не изящно и требует больше кода, но может быть более читаемым для новых пользователей R. Как указано выше, subset является «удобной» функцией, которая лучше всего используется при работе в интерактивном режиме.

 data <- data[-which(data[,1] %in% c("b","d","e")),] 

Этот ответ больше предназначен для объяснения, почему, а не как. Оператор '==' в R векторизован так же, как оператор '+' . Он соответствует элементам того, что находится на левой стороне, к элементам того, что находится справа, для каждого элемента. Например:

 > 1:3 == 1:3 [1] TRUE TRUE TRUE 

Здесь первый тест равен 1==1 который равен TRUE, второй 2==2 и третий 3==3 . Обратите внимание, что это возвращает FALSE в первом и втором элементах, потому что порядок неправильный:

 > 3:1 == 1:3 [1] FALSE TRUE FALSE 

Теперь, если один объект меньше, чем другой объект, тогда меньший объект повторяется столько, сколько требуется, чтобы соответствовать более крупному объекту. Если размер более крупного объекта не является умножением размера меньшего объекта, вы получаете предупреждение о том, что не все элементы повторяются. Например:

 > 1:2 == 1:3 [1] TRUE TRUE FALSE Warning message: In 1:2 == 1:3 : longer object length is not a multiple of shorter object length 

Здесь первое совпадение – 1==1 , затем 2==2 и, наконец, 1==3 (FALSE), потому что левая сторона меньше. Если одна из сторон – это только один элемент, то это повторяется:

 > 1:3 == 1 [1] TRUE FALSE FALSE 

Правильный оператор для проверки того, находится ли элемент в векторе, действительно является '%in%' который векторизован только для левого элемента (для каждого элемента в левом векторе он проверяется, если он является частью любого объекта в правом элементе) ,

Кроме того, вы можете использовать '&' для объединения двух логических операторов. '&' принимает два элемента и проверяет элементно, если оба имеют значение ИСТИНА:

 > 1:3 == 1 & 1:3 != 2 [1] TRUE FALSE FALSE 
 my.df <- read.table(textConnection(" v1 v2 v3 v4 avdc avdd bnpg bddhckdccrpg dvdx dvdc evdb evdc"), header = TRUE) my.df[which(my.df$v1 != "b" & my.df$v1 != "d" & my.df$v1 != "e" ), ] v1 v2 v3 v4 1 avdc 2 avdd 5 ckdc 6 crpg 

А также

 library(dplyr) data %>% filter(!v1 %in% c("b", "d", "e")) 

или

 data %>% filter(v1 != "b" & v1 != "d" & v1 != "e") 

или

 data %>% filter(v1 != "b", v1 != "d", v1 != "e") 

Так как оператор & подразумевается запятой.

 sub.data<-data[ data[,1] != "b" & data[,1] != "d" & data[,1] != "e" , ] 

Более просто, но просто для понимания (я думаю) и может использоваться с несколькими столбцами, даже с !is.na( data[,1]) .

  • Обрезка для SpatialPolygonsDataFrame
  • Ссылаясь на столбцы data.table именами, сохраненными в переменных
  • Цикл «для» добавляет только последний слой ggplot
  • Как организовать большие программы R?
  • Поиск 2 и 3 слов Фразы с использованием пакета R TM
  • Текущая дата YAML в rmarkdown
  • как вычислять среднее / медианное значение для каждой группы в кадре данных в r
  • Чтение файла Excel непосредственно из сценария R
  • Чтение нескольких (excel) файлов в R - Лучшая практика
  • Фильтрация строки, содержащей определенную строку с использованием dplyr
  • отсоединить все пакеты во время работы в R
  • Давайте будем гением компьютера.