Нахождение противоположного условия (используя R tidyverse), чтобы разделить набор данных на 2

avatar
Elysé Barbaza
1 июля 2021 в 18:44
52
2
2

Я пытаюсь разделить свой набор данных (296 строк) на две части, первая часть будет иметь некоторые условия, а другая — только остальная часть набора данных, которая не соответствует условиям.

Я сделал это и нашел 81 строку для первой части:

cardio = donnees %>%
  select(`Nausées/vomissements`,Vertige,Nystagmus,`Ataxie:Démarche ébrieuse`,`Motif si pas HINTS`,
         Alcool,Tabac,`atcd neuro`,Dyslipidémies,Diabète) %>%
  filter(Alcool == "Yes" |
         Tabac == "Yes"|
         `atcd neuro` == "3" |
         Dyslipidémies == "Yes"|
         Diabète == "Yes") 

Тогда я просто использую "!" чтобы найти остальные, но, к сожалению, я получил только 77 строк вместо ожидаемых 215,

donnees %>%
  select(`Nausées/vomissements`,Vertige,Nystagmus,`Ataxie:Démarche ébrieuse`,`Motif si pas HINTS`,
         Alcool,Tabac,`atcd neuro`,Dyslipidémies,Diabète) %>%
  filter(!(Alcool == "Yes" |
           Tabac == "Yes" |
           `atcd neuro` == "3" |
           Dyslipidémies == "Yes" |
           Diabète == "Yes" ))

Если кто-то может помочь? Большое спасибо

Источник

Ответы (2)

avatar
MonJeanJean
1 июля 2021 в 18:47
1

Вместо квадратных скобок можно заменить символы == и | на != и &:

donnees %>%
  select(`Nausées/vomissements`,Vertige,Nystagmus,`Ataxie:Démarche ébrieuse`,`Motif si pas HINTS`,
         Alcool,Tabac,`atcd neuro`,Dyslipidémies,Diabète) %>%
  filter(Alcool != "Yes" &
           Tabac != "Yes" &
           `atcd neuro` != "3" &
           Dyslipidémies != "Yes" &
           Diabète != "Yes" )

Изменить: вы можете использовать функцию anti-join:

cardio = donnees %>%
  select(`Nausées/vomissements`,Vertige,Nystagmus,`Ataxie:Démarche ébrieuse`,`Motif si pas HINTS`,
         Alcool,Tabac,`atcd neuro`,Dyslipidémies,Diabète) %>%
  filter(Alcool == "Yes" |
         Tabac == "Yes"|
         `atcd neuro` == "3" |
         Dyslipidémies == "Yes"|
         Diabète == "Yes")

others <- dplyr::anti_join(donnees, cardio)
Elysé Barbaza
1 июля 2021 в 18:51
0

Спасибо за ответ, к сожалению, я пробовал это и раньше, но результат - 77 строк (точно так же, как моя попытка)

MonJeanJean
1 июля 2021 в 18:52
0

Не могли бы вы предоставить образец с использованием dput, пожалуйста?

Elysé Barbaza
1 июля 2021 в 18:55
0

Могу я показать вам несколько скриншотов? Я действительно не знаю, как использовать dput?

MonJeanJean
1 июля 2021 в 18:59
0

@ElyséBarbaza проверьте изменения, которые я только что сделал. Кроме того, вот ссылка, чтобы сделать ваш пример воспроизводимым: coderhelper.com/questions/5963269/…

Elysé Barbaza
1 июля 2021 в 19:03
0

Большое спасибо за вашу помощь, это сработало, я очень благодарен. Хорошего вечера! Эта платформа потрясающая

MonJeanJean
1 июля 2021 в 19:04
0

Не забудьте подтвердить ответ! Добро пожаловать в СО! Наслаждайтесь @ElyséBarbaza

avatar
monte
1 июля 2021 в 19:02
2

Метод anti_join, предложенный @MonJeanJean, должен работать. Но если это не так, здесь немного другой подход, идея состоит в том, чтобы создать столбец индекса и исключить то, что вам не нужно (напоминает дни MySQL).

donnees$index = 1:nrow(donnees)

cardio = donnees %>%
  select(`Nausées/vomissements`,Vertige,Nystagmus,`Ataxie:Démarche ébrieuse`,`Motif si pas HINTS`,
         Alcool,Tabac,`atcd neuro`,Dyslipidémies,Diabète, index) %>%
  filter(Alcool == "Yes" |
         Tabac == "Yes"|
         `atcd neuro` == "3" |
         Dyslipidémies == "Yes"|
         Diabète == "Yes")

cardio_required = cardio[-index, ]

Это даст вам 215 строк

MonJeanJean
1 июля 2021 в 19:04
0

Я думал об этом методе, но для меня это может быть слишком затратным по ресурсам, если у вас много строк. Но это хорошо работает для этого маленького образца!

Elysé Barbaza
1 июля 2021 в 19:13
0

Спасибо за этот другой метод!