Удалить строку на основе двух отдельных требований соответствия - PullRequest
0 голосов
/ 02 октября 2018

Если есть сообщение об этом, я прошу прощения - я много раз искал ответ и не мог найти ничего, что работает.

Что мне нужно сделать, это удалить все строки в следующем примере, которыеравен 66 только в том случае, если есть дубликат типа животных с чем-то отличным от 66.

animals <- c("dog", "dog", "dog", "cat", "cat", "cat", "mouse", "mouse", "rat", "rat")
number <- c(1,2,66,2,66,66,66,66,2,1)

df <- data.frame(animals,number)

Используя этот df, я бы хотел удалить строку 3, потому что у собаки есть другие значения 1 и 2, я бы хотелудалить обе 66 для cat, потому что есть cat с другим значением 2, но я не хотел бы удалять записи мыши, потому что они обе 66, и я не хотел бы ничего удалять с помощью rat, потому что нет значений 66.

Я бы закончил что-то похожее на это:

animals <- c("dog", "dog", "cat", "mouse", "mouse", "rat", "rat")
number <- c(1,2,2,66,66,2,1) 

В реальном наборе данных есть так много записей, что вы просто не можете использовать счетчик и удалить все с общей суммойменее 66 (это был мой первый инстинкт)

Это была моя вторая попытка, но по какой-то причине я не мог продумать ее.

df(!number == 66 | if(unique(animals) ==

Может быть, какое состояние меняне участвует?Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

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

library(dplyr)
df %>% group_by(animals) %>%
  mutate(Flag= case_when( number %in% c(1,2) ~ 1,
                          all(number == 66) ~ 1,
                          number == 66 ~ 0)) %>% 
  filter(Flag==1) %>% select(-Flag) %>% ungroup()


# A tibble: 7 x 2
animals number
<chr>    <dbl>
1 dog         1.
2 dog         2.
3 cat         2.
4 mouse      66.
5 mouse      66.
6 rat         2.
7 rat         1.
0 голосов
/ 02 октября 2018

В одну сторону, используя базу R ave, где мы проверяем, есть ли у какого-либо животного число, отличное от 66, если оно есть, мы возвращаем тех, которые игнорируют 66, или же возвращаем все строки.

df[with(df, ave(number != 66, animals, FUN = function(x) if (any(x)) x else !x)), ]


#  animals number
#1     dog      1
#2     dog      2
#3     cat      2
#4   mouse     66
#5   mouse     66
#6     rat      2
#7     rat      1

Версия dplyr будет filter групп, в которой есть все 66, или игнорирует строки с 66 в противном случае.

library(dplyr)

df %>%
   group_by(animals) %>%
   filter(all(number == 66) | number != 66)

# animals number
#  <fct>    <dbl>
#1 dog          1
#2 dog          2
#3 cat          2
#4 mouse       66
#5 mouse       66
#6 rat          2
#7 rat          1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...