Для каждого уникального идентификатора я хотел бы иметь только одну строку на основе рейтинга другого поля.

В конечном итоге я хочу создать таблицу, содержащую каждый уникальный идентификатор, который есть в моем наборе данных, с соответствующим полем на основе «ранжирования» этого поля.

Я очень застрял на этом шаге. Я рассмотрел цикл для каждого уникального идентификатора, но хотел посмотреть, есть ли более простой способ. Возможно, вам может помочь семейство функций apply. Я также не уверен в способе ранжирования различных строковых значений (например, ИСТИНА> ЛОЖЬ> НД).

Ниже приведен небольшой пример того, что я ищу, только с двумя интересующими нас областями:

df1 <- data.frame(ID = c(1,1,2,2,3,3,3,4,4,5,6,7,7), flag = c("NA", "TRUE", "NA", "FALSE", "TRUE", "TRUE", "FALSE", "NA", "NA", "NA", "TRUE", "FALSE", "FALSE"))

Для каждого идентификатора:

  • Если в поле флага есть хотя бы одна «ИСТИНА», я хочу вытащить одну из этих целых строк (не имеет значения, какую из них).
  • Если идентификатор не содержит значения «ИСТИНА» в поле флага, но имеет «ЛОЖЬ» хотя бы в одной строке, я хочу извлечь одну из этих целых строк.
  • Если идентификатор не имеет значения «ИСТИНА» или «ЛОЖЬ» в поле флага, мне все равно нужна одна из строк «Н / Д».

Ниже приведен отдельный фрейм данных, который я в идеале хотел бы иметь:

ideal.df <- data.frame(ID = c(1,2,3,4,5,6,7), flag = c("TRUE", "FALSE", "TRUE", "NA", "NA", "TRUE", "FALSE"))

Заранее благодарю за любую помощь!


person K.C.    schedule 10.06.2019    source источник
comment
Возможный дубликат stackoverflow.com/questions/13279582 /   -  person akrun    schedule 10.06.2019
comment
Прошу прощения, если это повторяющийся вопрос - у меня возникли проблемы с концептуальным осмыслением проблемы, так что вполне может быть. Но ответ, предоставленный @ Ronak-Shah, - это именно то, что мне нужно, и он сильно отличается от ответа на вопрос, с которым вы связались.   -  person K.C.    schedule 10.06.2019
comment
Все нормально. Это один из тех вопросов, которые мы получаем в первой строке каждой группы. Я подумал, что это обман. Обычно он был бы закрыт и будет закрыт. Поскольку он снова открывается по простой технической причине, я восстановил свой ранее опубликованный ответ с помощью измененного.   -  person akrun    schedule 10.06.2019
comment
@akrun - Спасибо за разъяснения   -  person K.C.    schedule 10.06.2019
comment
Без проблем. Обратите внимание, что дублирование тегов не считается плохим. это упрощает поиск аналогичного поста в будущем. Итак, я просто оказываю хорошее самаритянское обслуживание SO и всем другим людям, которые ищут похожий пост в будущем,   -  person akrun    schedule 10.06.2019


Ответы (2)


Один из вариантов - преобразовать переменную flag в упорядоченный коэффициент и получить максимальное значение из каждой группы.

library(dplyr)

df1 %>%
  mutate(flag = factor(flag, levels = c("NA", "TRUE", "FALSE"), ordered = TRUE)) %>%
  group_by(ID) %>%
  slice(which.max(flag))

#     ID flag 
#  <dbl> <ord>
#1     1 TRUE 
#2     2 FALSE
#3     3 FALSE
#4     4 NA   
#5     5 NA   
#6     6 TRUE 
#7     7 FALSE
person Ronak Shah    schedule 10.06.2019

Можно было бы использовать slice с match

library(dplyr)
df1 %>% 
   group_by(ID) %>% 
   slice(which.max(match(flag, c("NA", "TRUE", "FALSE"))))
# A tibble: 7 x 2
# Groups:   ID [7]
#     ID flag 
#  <dbl> <fct>
#1     1 TRUE 
#2     2 FALSE
#3     3 FALSE
#4     4 NA   
#5     5 NA   
#6     6 TRUE 
#7     7 FALSE

Или используйте rank с which.min в столбце logical 'flag'

df1 %>% 
   group_by(ID) %>% 
   slice(which.min(rank(as.logical(flag)) ))
# A tibble: 7 x 2
# Groups:   ID [7]
#     ID flag 
#  <dbl> <fct>
#1     1 TRUE 
#2     2 FALSE
#3     3 FALSE
#4     4 NA   
#5     5 NA   
#6     6 TRUE 
#7     7 FALSE
person akrun    schedule 10.06.2019