我有這樣一個資料框架樣本:
我有這樣一個資料框架樣本。
df <- data. frame(ID = c("5"/span>。 "5","5"。 "5","5"。 "5" ,"5" ,"5"。 "5","5",。 "14", "14", "14","14" 。 "14","14"),
Date1= c("22/07/2014"。 "22/07/2014","22/07/2014".
,"22/07/2014"。
,"22/07/2014"
,"22/07/2014"
,"22/07/2014"
,"22/07/2014"
,"22/07/2014"
,"22/07/2014"
,"22/07/2014"
,"08/11/2016"。
,"08/11/2016"
, "08/11/2016"/span>
, "08/11/2016"/span>
, "08/11/2016"/span>
, "08/11/2016"),
Date2= c("01/01/2011"/span>)
,"01/08/2011"。
,"01/12/2010"
,"10/11/2015"。
,"22/07/2014"。
,"01/01/2013"。
,"23/04/2014"
,"01/01/2006"。
,"01/01/2013"。
,"01/10/2012"。
,"01/08/2012"。
,"14/04/2015"。
,"01/10/2008"。
,"01/10/2008"。
,"14/05/2015"。
,"11/04/2015"。
,"05/10/2008"),
stringsAsFactors = F)
在這里,我有每個ID重復了幾次。我需要得到一個每個ID只有1行的資料框架。正如你所看到的,每個病人在df$date1列中只有一個日期,所以每個病人選擇1行的條件是:在日期1和日期2之間選擇最接近的日期。
我怎樣才能做到呢?
Thansk
uj5u.com熱心網友回復:
這里有一個tidyverse方法。我創建了一個名為diff_date的列,它是Date1和Date2之間的絕對差異。然后我通過每個ID過濾了最小的差異。
library(dplyr)
library(lubridate)
df %>%。
mutate()
across(. cols = starts_with("Date"),. fns = dmy),。
diff_date = abs(as. numeric(difftime(Date1, Date2)))
) %>%
group_by(ID) %>%
filter(diff_date == min(diff_date))
# A tibble: 2 x 4
# 組。 ID [2]
ID Date1 Date2 diff_date
<chr> <date> <date> <dbl>
1 5 2014-07-22 2014-07-22 0
2 14 2016-11-08 2015-05- 14 47001600
uj5u.com熱心網友回復:
試一下下面的基礎R代碼
unique()
subset()
df,
!!ave()
abs(as.integer(as. Date(Date2, 格式= "%d/%m/%Y") - as. Date(Date1, 格式= "%d/%m/%Y")))。
ID,
FUN = function(x)x == min(x)
)
)
)
并且你將得到
ID Date1 Date2
5 5 22/07/2014 22/07/2014
15 14 08/11/2016 14/05/2015
uj5u.com熱心網友回復:
使用base R,將 "Date "列轉換為Date類,根據 "ID "和absDate列之間的絕對差異對資料進行排序
duplicated即 "ID "列上的第一條唯一行進行子集。
df[2: 3] < - lapply(df[2。 3],作為。 Date, format = "%d/%m/%Y")
df1 < -df[with(df, order(ID, abs(as. numeric(Date1) - as. numeric(Date2))))。 ]
df1[! duplicated(df1$ID),]
輸出
ID Date1 Date2
15 14 2016-11- 08 2015-05-14
5 5 2014- 07- 22 2014-07-22
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/328396.html
標籤:
上一篇:謂詞和日期的執行緒安全問題
