我需要對資料幀 d 進行子集化,并且我喜歡為每個 ID 號保留一行。但保留的行應包括 AD 或 BD 中的 I50,并且僅應保留日期最早的行。
所以最后我們將有兩行 (ID:1&2) 和 AD/BD 中的 I50 的資料框,以及最早的可能日期,因此日期將是 2007-12-12 和 2009-12-12。
我真的嘗試了很多但找不到解決方案。
ID <- c(1,1,1,1,1,2,2,2,2,2)
AD <- c("DJ400", "DJ300", "DI501", "DI509", "DR409",
"DI509", "DJ200", "DA300", "DI500", "DR209")
Date <- as.Date(c("2010-12-12", "2011-12-12", "2007-12-12", "2008-12-12", "2009-12-12",
"2011-12-12", "2012-12-12", "2008-12-12", "2009-12-12", "2010-12-12"))
BD <- c("DI509", "DI500", "DI401", "DI409", "DR609",
"DI309", "DJ200", "DA300", "DI500", "DI509")
d <- data.frame(ID, AD, Date, BD)
hf <- subset(d, AD %in% "I50" | BD %in% "I50")
由reprex 包于 2022-01-10 創建 (v2.0.0 )
在第一個解決方案之后,我遇到了一些問題,我做了一些小改動,這里是新的代表。我只需要每個 ID 一行。問題是有幾個日期相同,而我之前沒有包括在內。
ID <- c(1,1,1,1,1,2,2,2,2,2)
AD <- c("DJ400", "DJ300", "DI501", "DI509", "DR409",
"DI509", "DJ200", "DA300", "DI500", "DR209")
Date <- as.Date(c("2010-12-12", "2011-12-12", "2010-12-12", "20012-12-12", "2009-12-12",
"2011-12-12", "2012-12-12", "2012-12-12", "2009-12-12", "2010-12-12"))
BD <- c("DI509", "DI500", "DI401", "DI409", "DR609",
"DI309", "DJ200", "DA300", "DI500", "DI509")
d <- data.frame(ID, AD, Date, BD)
library(dplyr)
d %>%
group_by(ID) %>%
filter(if_any(c(AD, BD), ~ grepl("I50", .))) %>%
slice_min(Date) %>%
ungroup()
#> # A tibble: 3 x 4
#> ID AD Date BD
#> <dbl> <chr> <date> <chr>
#> 1 1 DJ400 2010-12-12 DI509
#> 2 1 DI501 2010-12-12 DI401
#> 3 2 DI500 2009-12-12 DI500
由reprex 包于 2022-01-11 創建(v2.0.1)
uj5u.com熱心網友回復:
堿基R
d2 <- subset(d, grepl("I50", AD) | grepl("I50", BD))
do.call(rbind, lapply(split(d2, d2$ID), function(z) z[which.min(z$Date),]))
# ID AD Date BD
# 1 1 DI501 2007-12-12 DI401
# 2 2 DI500 2009-12-12 DI500
dplyr
library(dplyr)
d %>%
group_by(ID) %>%
filter(if_any(c(AD, BD), ~ grepl("I50", .))) %>%
slice_min(Date) %>%
ungroup()
# # A tibble: 2 x 4
# ID AD Date BD
# <dbl> <chr> <date> <chr>
# 1 1 DI501 2007-12-12 DI401
# 2 2 DI500 2009-12-12 DI500
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/411008.html
標籤:
