2

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

我一直非常坚持这一步。我考虑过为每个唯一 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:

  • 如果标志字段中至少有一个“TRUE”,我想拉出这些整行中的一个(不管是哪一个)。
  • 如果一个 ID 在标志字段中不包含“TRUE”值,但在至少一行中有“FALSE”,我想提取其中一整行。
  • 如果 ID 在标志字段中没有“TRUE”或“FALSE”值,我仍然想要“NA”行之一。

以下是我希望拥有的单独数据框:

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

提前感谢您的帮助!

4

2 回答 2

3

一个选项是使用slicewithmatch

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

或在“标志”列上使用rankwithwhich.minlogical

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
于 2019-06-10T16:02:14.693 回答
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
于 2019-06-10T16:06:36.483 回答