В конечном счете, я хочу создать таблицу, содержащую каждый уникальный идентификатор, который у меня есть в моем наборе данных, с соответствующим полем на основе «рейтинга» этого поля.
Я очень застрял на этом шаге. Я рассмотрел цикл для каждого уникального идентификатора, но хотел посмотреть, есть ли более простой способ. Возможно, вам поможет семейство функций apply. Я также не уверен в способе ранжирования различных строковых значений (например, ИСТИНА > ЛОЖЬ > 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"))
Для каждого идентификатора:
Ниже приведен отдельный фрейм данных, который я бы хотел иметь в идеале:
ideal.df <- data.frame(ID = c(1,2,3,4,5,6,7), flag = c("TRUE", "FALSE", "TRUE", "NA", "NA", "TRUE", "FALSE"))
Заранее благодарю за любую помощь!
Прошу прощения, если это дублирующийся вопрос - у меня возникли проблемы с осмыслением проблемы, так что вполне может быть. Но ответ, предоставленный @Ronak-Shah, - это именно то, что мне было нужно, и он сильно отличается от ответа на вопрос, на который вы ссылались.
Все в порядке. Это один из тех вопросов, которые мы получаем в первой строке каждой группы. Я подумал, что это обман. Обычно он был бы и был бы закрыт. Поскольку он снова открыт из-за простой технической особенности, я восстановил свой ранее опубликованный ответ с измененным.
@akrun - Спасибо за разъяснение
Без проблем. Обратите внимание, что дублирование тегов не считается чем-то плохим. это облегчает поиск аналогичного поста в будущем. Итак, я просто оказываю добрую самаритянскую услугу SO и всем другим людям, которые ищут подобный пост в будущем,
Вариантом было бы использовать 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
«флажок».
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
Один из вариантов — преобразовать переменную 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
Возможный дубликат stackoverflow.com/questions/13279582/…