【问题标题】:How can I extract dup values with same max date based on another var?如何基于另一个 var 提取具有相同最大日期的 dup 值?
【发布时间】:2020-11-05 12:50:22
【问题描述】:

我生成了“withrepeats”一个 df,其中的行在另一个 df 中至少有一个重复项(可变 DROPS 作为每个唯一 FID+ID 的重复次数)。

FID ID CID CT DROPS    DATE
123 CV  1  2    3   11-3-2020
123 CV  2  2    2   11-3-2020
123 CV  3  1    1   11-3-2020  
456 LO  1  1    2   10-4-2020 
456 LO  2  1    1   10-5-2020
678 IP  1  2    3   11-1-2020
678 IP  1  1    2   11-2-2020
678 IP  2  2    1   10-29-2020
111 AK  1  2    2   11-2-2020
111 AK  2  2    1   11-1-2020
222 PL  4  2    2   11-1-2020
222 PL  3  2    2   11-1-2020 

我想只提取每个唯一 ID 和 FID 的掉落物之一,并保持最新的 DATE。对于 CT == 1 的行,我只想保留该行并保留最新日期。对于那些只有 CT== 2 值的行,也要保留最新日期。这是我正在使用的代码行:

keepers <- withrepeats %>% group_by %>% (ID, FID) %>% filter(DATE == max(DATE))

但是,具有相同日期的行将被保留。在这种情况下,我想保留最高的 CID ,或者,如果有 CT == 1 的行,则保留该行。

期望的输出:

FID ID CID CT DROPS    DATE
123 CV  3  1    1   11-3-2020   
456 LO  2  1    1   10-5-2020
678 IP  1  1    2   11-2-2020
111 AK  1  2    2   11-2-2020
222 PL  4  2    2   11-1-2020

你会怎么做呢?任何帮助将不胜感激!

【问题讨论】:

  • 预期输出是否正确
  • 我更新了 df 和输出。感谢您的耐心等待。

标签: r dplyr duplicates data-wrangling


【解决方案1】:

我们可以将'DATE'转换为Date类,然后按'FID'和slice在'DATE'中具有max值的行进行分组

library(dplyr)
library(lubridate)
withrepeats %>%
   mutate(DATE = mdy(DATE)) %>%
   arrange(FID, desc(CID)) %>%
   group_by(FID) %>% 
   mutate(mxDate = if(any(CT == 1)) DATE[which.max(DATE)] else 
        DATE[which.max(DATE)]) %>%
   filter(DATE == mxDate & !duplicated(DATE)) %>% 
   ungroup %>% 
   slice(c(2, 4, 5, 1, 3)) %>%
   select(-mxDate)

-输出

# A tibble: 5 x 6
#    FID ID      CID    CT DROPS DATE      
#  <int> <chr> <int> <int> <int> <date>    
#1   123 CV        3     1     1 2020-11-03
#2   456 LO        2     1     1 2020-10-05
#3   678 IP        1     1     2 2020-11-02
#4   111 AK        1     2     2 2020-11-02
#5   222 PL        4     2     2 2020-11-01

数据

withrepeats <- structure(list(FID = c(123L, 123L, 123L, 456L, 456L, 678L, 678L, 
678L, 111L, 111L, 222L, 222L), ID = c("CV", "CV", "CV", "LO", 
"LO", "IP", "IP", "IP", "AK", "AK", "PL", "PL"), CID = c(1L, 
2L, 3L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 4L, 3L), CT = c(2L, 2L, 1L, 
1L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L), DROPS = c(3L, 2L, 1L, 2L, 
1L, 3L, 2L, 1L, 2L, 1L, 2L, 2L), DATE = c("11-3-2020", "11-3-2020", 
"11-3-2020", "10-4-2020", "10-5-2020", "11-1-2020", "11-2-2020", 
"10-29-2020", "11-2-2020", "11-1-2020", "11-1-2020", "11-1-2020"
)), class = "data.frame", row.names = c(NA, -12L))

【讨论】:

  • 谢谢!有几行 PID+ID 没有 CT == 1,只有 2。我不想完全过滤掉它们,但仍然保留这些的最新日期。我将更新我的数据子集。再次感谢
  • @akrum 谢谢。如何为具有相同日期的人保留最高 CID 或 CASE_ID?
【解决方案2】:

首先将DATE 转换为实际日期对象,arrange 数据由FIDIDCT 值,然后为每个组选择最大值DATE

library(dplyr)

withrepeats %>%
  mutate(DATE = as.Date(DATE, '%m-%d-%Y')) %>%
  arrange(FID, ID, CT) %>%
  group_by(FID, ID) %>%
  slice(which.max(DATE))

#    FID ID      CID    CT DROPS DATE      
#  <int> <chr> <int> <int> <int> <date>    
#1   111 AK        1     2     2 2020-11-02
#2   123 CV        3     1     1 2020-11-03
#3   222 PL        4     2     2 2020-11-01
#4   456 LO        2     1     1 2020-10-05
#5   678 IP        1     1     2 2020-11-02

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多