如何根据另一个 var 提取具有相同最大日期的重复值?
How can I extract dup values with same max date based on another var?
我生成了 '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
你会怎么做?任何帮助将不胜感激!
我们可以将 'DATE' 转换为 Date
class,然后按 'FID' 和 slice
对包含 [=15= 的行进行分组] 'DATE'
中的值
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))
首先将 DATE
转换为实际日期对象,arrange
数据由 FID
、ID
和 CT
值和 select 最大值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
我生成了 '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
你会怎么做?任何帮助将不胜感激!
我们可以将 'DATE' 转换为 Date
class,然后按 'FID' 和 slice
对包含 [=15= 的行进行分组] 'DATE'
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))
首先将 DATE
转换为实际日期对象,arrange
数据由 FID
、ID
和 CT
值和 select 最大值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