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»:
- Совокупное число в R
- более быстрый способ создания переменной, которая агрегирует столбец по id
- Проблема при передаче переменной с обозначением знака доллара ($) на aes () в сочетании с facet_grid () или facet_wrap ()
- Как сообщить интерпретатору R, как использовать прокси-сервер?
- Поместите легенду для каждой сетки facet_wrap в ggplot2
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%
, но это, похоже, не существует. Есть идеи?
- Отображение времени в командной строке R
- R - Поиск ближайшей соседней точки и числа соседей в заданном радиусе, координаты lat-long
- Изменить несколько значений сразу
- R + ggplot: отображение нескольких страниц
- Как вы конвертируете дату POSIX в день года в R?
- Использование циклов с knitr для создания нескольких отчетов в формате PDF ... нужно немного помочь, чтобы получить меня за горб
- Добавление столбца между двумя столбцами в файле data.frame
- Установите определенные значения в NA с помощью dplyr
!
должно быть вокруг внешней стороны заявления:
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])
.