【问题标题】:For each unique ID, I would like to have only one row based on a ranking of another field对于每个唯一 ID,我希望只有一行基于另一个字段的排名
【发布时间】:2019-06-10 15:58:37
【问题描述】:

最终,我希望创建一个表,其中包含我在数据集中拥有的每个唯一 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"))

提前感谢您的帮助!

【问题讨论】:

  • 如果这是一个重复的问题,我深表歉意 - 我在概念化这个问题时遇到了麻烦,所以很可能是这样。但是@Ronak-Shah 提供的答案正是我所需要的,并且看起来与您链接到的问题的答案完全不同。
  • 没关系。这是我们得到每组第一行的问题之一。我认为这是一个骗局。通常情况下,它将被关闭,因为它由于简单的技术性而重新打开,我用一个修改过的答案取消删除了我之前发布的答案。
  • @akrun - 感谢您的澄清
  • 没问题。请注意,重复标记并不是一件坏事。它使将来更容易找到类似的帖子。所以,我只是在为 SO 和所有其他在未来搜索类似帖子的人提供良好的撒玛利亚人服务,

标签: r match unique ranking-functions


【解决方案1】:

一个选项是使用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“标志”列上使用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

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 2012-11-29
      相关资源
      最近更新 更多