Как удалить строки из data.frame, когда фактор принимает определенные значения в R [дубликаты]

Я работаю над набором данных об автомобилях в R. В нем у меня есть один столбец с именем fuel, который имеет классовый коэффициент. Итак, общее количество автомобилей распределено по 5 типам. Я хочу удалить 3 типа из этого столбца. Пример выглядит следующим образом:

fuel:  
 CNG     :  40                                                                                      
 Diesel  :2133   
 Electric:   1   
 LPG     :  23                          
 Petrol  :2120

Как удалить уровни факторов CNG, Electric и LPG одной командой?

Я пробовал, как показано ниже, это работает, но я думаю, что есть лучший способ сделать это, например, с помощью 1-строчной команды.

1.

car <- car[!car$fuel == "CNG", ]
car <- car[!car$fuel == "Electric", ]
car <- car[!car$fuel == "LPG", ]

Я также пробовал следующим образом, но это не сработало. Почему не работает приведенная ниже команда?

2.

car <- car[!car$fuel == "CNG"||"Electric"||"LPG", ]

person Pratik Aphale    schedule 19.08.2020    source источник
comment
Откуда берется набор данных?   -  person sindri_baldur    schedule 19.08.2020
comment
Я использовал этот набор данных от Kaggle, набор данных о транспортных средствах от cardekho. Использование его для изучения линейной регрессии в R.   -  person Pratik Aphale    schedule 19.08.2020


Ответы (2)


Распространенным решением является что-то вроде:

car[!(car$fuel %in% c("CNG", "Electric", "LPG")), ]

Чтобы второе решение сработало, сначала вам нужно использовать |, а не ||, поскольку вы имеете дело с векторами. Во-вторых, вам нужно указать логический тест, который необходимо реализовать, чтобы R понял:

car[!(car$fuel == "CNG" | car$fuel == "Electric" | car$fuel == "LPG"), ]

Что упрощает согласно законам Де Моргана:

car[car$fuel != "CNG" & car$fuel != "Electric" & car$fuel != "LPG", ]
person sindri_baldur    schedule 19.08.2020
comment
Спасибо за ответ. Также не могли бы вы объяснить, почему вторая команда, которую я написал, не сработала? - person Pratik Aphale; 19.08.2020
comment
Спасибо за пояснение! - person Pratik Aphale; 19.08.2020

Чтобы добавить в решение sindri_baldur, вы можете использовать subset следующим образом

# simulate data
set.seed(2)
n <- 12
car <- data.frame(fuel = factor(
  sample.int(5, size = n, replace = TRUE), 
  labels = c("CNG", "Electric", "LPG", "Gas", "Unknown")), 
  id = 1:n)

# show alternative solution
subset(car, fuel != "CNG" & fuel != "Electric" & fuel != "LPG")
#R>      fuel id
#R> 1 Unknown  1
#R> 3 Unknown  3
#R> 5     Gas  5
#R> 6 Unknown  6

subset(car, !fuel %in% c("CNG", "Electric", "LPG"))
#R>      fuel id
#R> 1 Unknown  1
#R> 3 Unknown  3
#R> 5     Gas  5
#R> 6 Unknown  6

Ваша вторая версия не работает, потому что вы используете ||, а не |. См. help("Logic", package = "base") и, в частности,

& и && обозначают логическое И, а | и || обозначают логическое ИЛИ. Более короткая форма выполняет поэлементные сравнения почти так же, как арифметические операторы. Более длинная форма оценивает слева направо, проверяя только первый элемент каждого вектора.

person Benjamin Christoffersen    schedule 19.08.2020