Для каждого уникального идентификатора я хотел бы иметь только одну строку на основе ранжирования другого поля - PullRequest
2 голосов
/ 10 июня 2019

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

Я очень застрял на этом шаге. Я рассмотрел циклы для каждого уникального идентификатора, но хотел посмотреть, есть ли более простой способ. Возможно, применение семейства функций могло бы помочь. Я также не уверен в способе ранжировать различные строковые значения (например, TRUE> FALSE> NA).

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

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"))

Для каждого ID:

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 10 июня 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
2 голосов
/ 10 июня 2019

Один из вариантов - преобразовать переменную 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...