对于每个唯一 ID,我希望只有一行基于另一个字段的排名

For each unique ID, I would like to have only one row based on a ranking of another field

最终,我希望创建一个 table,其中包含我在数据集中拥有的每个唯一 ID 以及相应的字段,基于该字段的 "ranking"。

我一直卡在这一步。我考虑过为每个唯一 ID 循环,但想看看是否有更简单的方法。 apply 函数族可能会有所帮助。我也不确定如何对不同的字符串值进行排名(例如,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:

下面是我理想中想要的单独数据框:

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

在此先感谢您的帮助!

一个选项是使用 slicematch

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

或在 logical 'flag' 列

上使用 rankwhich.min
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