R: использование dplyr для удаления определенных строк в data.frame - PullRequest
0 голосов
/ 11 июня 2018
dat <- data.frame(ID = c(1, 2, 2, 2), Gender = c("Both", "Both", "Male", "Female"))
> dat
  ID Gender
1  1   Both
2  2   Both
3  2   Male
4  2 Female

Для каждого идентификатора, если пол - Both, Male и Female, я хочу удалить строку с Both.То есть мои желаемые данные таковы:

  ID Gender
1  1   Both
2  2   Male
3  2 Female

Я пытался сделать это, используя код ниже:

library(dplyr)
> dat %>% 
  group_by(ID) %>% 
  mutate(A = ifelse(length(unique(Gender)) >= 3 & Gender == 'Both', F, T)) %>% 
  filter(A) %>% 
  select(-A)

# A tibble: 2 x 2
# Groups:   ID [1]
     ID Gender
  <dbl> <fctr>
1     2   Male
2     2 Female

Я объявляю фиктивную переменную с именем A, где A = F, если для данного ID присутствуют все 3 элемента Gender («Оба», «Мужской» и «Женский»; это разные значения, которые Gender может принимать, нетвозможно другое значение) и соответствующая строка имеет Gender == Both.Тогда я удалю этот ряд.

Тем не менее, похоже, что я назначаю A = F для первого ряда, хотя его Gender - это только "Оба", но не "Оба", "Мужской" и "Женский"?

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Из базы R, используя ave

dat[!(ave(dat$Gender,dat$ID,FUN=function(x) length(unique(x)))!='1'&(dat$Gender=='Both')),]
  ID Gender
1  1   Both
3  2   Male
4  2 Female
0 голосов
/ 11 июня 2018

После группировки по «ID» создайте логическое условие, где «Пол» не равен «Оба», а длина элемента «1001 *» в поле «Пол» равна 3, т. Е. «Мужчина», «Женщина», «Оба».(как упоминалось в OP, других значений нет) или (|), если количество элементов составляет всего 1

dat %>% 
  group_by(ID) %>% 
  filter((Gender != "Both" & n_distinct(Gender)==3)| n() ==1 )
# A tibble: 3 x 2
# Groups:   ID [2]
#    ID Gender
#  <dbl> <fct> 
#1     1 Both  
#2     2 Male  
#3     2 Female

Или другой вариант -

dat %>%
   group_by(ID) %>% 
   filter(Gender %in% c("Male", "Female")| n() == 1)
# A tibble: 3 x 2
# Groups:   ID [2]
#     ID Gender
#  <dbl> <fct> 
#1     1 Both  
#2     2 Male  
#3     2 Female
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...