R_exclude строк со столбцом, содержащим значение, если существует несколько строк - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть дата-тест "test", как показано ниже. Я хочу исключить все строки этого человека, если у этого человека есть «яблоко» в колонке «фрукты», используя язык R. Я написал:

filter(test, name != test$name[test$fruit=="apple"])

оригинальный "тестовый" фрейм данных

enter image description here

фактический результат

enter image description here

ожидаемый результат

enter image description here

Любая помощь приветствуется! Спасибо!

Ответы [ 2 ]

1 голос
/ 05 февраля 2020
> test
     name      fruit
1   kevin      apple
2   kevin       pear
3   kevin      peach
4    jack      apple
5    jack       pear
6    jack      peach
7    jack       kiwi
8   caleb grapefruit
9   caleb       kiwi
10  caleb       pear
11 justin  pineapple
12 justin      grape
13 justin watermelon
14 justin       kiwi

Сначала мы находим все «имя», в котором «яблоко» является фруктом.

 df=unique(test$name[test$fruit=="apple"])

> df
[1] kevin jack 
Levels: caleb jack justin kevin

Теперь нам нужно удалить строки из строк из test где name такое же, как в df , то есть 'kevin' или 'jack'.

test1= test[ (!(test$name %in% df)),]

> test1
     name      fruit
8   caleb grapefruit
9   caleb       kiwi
10  caleb       pear
11 justin  pineapple
12 justin      grape
13 justin watermelon
14 justin       kiwi

Конечно, мы можем написать это в одной строке:

test2=test[(!(test$name %in% (unique(test$name[test$fruit=="apple"])))),]

> test2
     name      fruit
8   caleb grapefruit
9   caleb       kiwi
10  caleb       pear
11 justin  pineapple
12 justin      grape
13 justin watermelon
14 justin       kiwi

1 голос
/ 05 февраля 2020

Вы можете сделать это несколькими способами.

В базе R:

subset(test, !ave(fruit == 'apple', name, FUN = any))

#   name     fruit
#4 Justin pineapple
#5 Justin     grape

Использование dplyr

test %>% group_by(name) %>% filter(!any(fruit == 'apple'))

Или data.table

setDT(test)[, .SD[!any(fruit == 'apple')], name]

Другой вариант в базе R без группировки может быть

subset(test, !name %in% unique(name[fruit == "apple"]))

data

test <- data.frame(name = c('Jack', 'Jack', 'Jack', 'Justin', 'Justin'), 
             fruit  =c('pineapple', 'apple', 'grape', 'pineapple', 'grape'))
...