我想按各個時間范圍選擇觀察結果 - 我的模擬資料可以解釋我需要什么:
有兩個資料框:
- event_data:包含在特定日期經歷事件的個人(人)。每個事件都是一個新行,但個人(由“event_person_id”標識)也可能經歷多個事件(可能是 2、3、4、5……)。
- 訪問資料:包含與個人的所有個人聯系。每次訪問都分配給一個人(“visit_person_id”)并有自己的visit_date。訪問次數遠多于事件。
Visit_data 包含的資料比我最終需要的要多,因為我只想選擇 visit_data 中的那些行,這些行發生在“event_date”加上兩年之間的時間范圍內。
例如: Person_id 1 有兩個事件 - 第一個是 2014 年 3 月 21 日,第二個是 2018 年 8 月 8 日,所以我只想選擇visit_data 中日期在2014 年3 月21 日和2016 年3 月21 日之間以及8 月8 日之間的那些行2018 年和 2020 年 8 月 8 日。
我的想法是通過person_id加入event_data和visit_data - 所以我有一個包含visit_date和event_date的新資料框,然后我可以選擇相關資訊,但我的方法并不完全正確,因為它(隨機?)分配第一個或者訪問行的第二個 event_date,fe person_id 5在 1988-12-15 有一次訪問,但是 event_date 是 2019-09-03 而不是 1988-03-04,所以這次訪問被忽略,因為 2019 不在1988 年至 1990 年。
如果我加入表格的想法完全錯誤,或者有更聰明的方法,我想學習這種更好的方法!
這是我的代碼:
library(dplyr)
library(lubridate)
set.seed(123)
event_data <- data.frame(event_person_id = seq(1, 100, 1),
event_date = sample(seq(as.Date('1980/01/01'), as.Date('2010/12/31'), by="day"), 100),
age = round(runif(100, min = 1, max = 80)),
bmi = round(runif(100, min = 19, max = 30)),
amount = round(runif(100, min = 10, max = 10000)),
stringsAsFactors = FALSE)
event_data2 <- data.frame(event_person_id = seq(1, 10, 1),
event_date = sample(seq(as.Date('2011/01/01'), as.Date('2020/12/31'), by="day"), 10),
age = round(runif(10, min = 1, max = 80)),
bmi = round(runif(10, min = 19, max = 30)),
amount = round(runif(10, min = 10, max = 10000)),
stringsAsFactors = FALSE)
event_data_total <- rbind(event_data, event_data2)
visit_data <- data.frame(visit_person_id = round(runif(10000, min = 1, max = 100)),
visit_id = seq(1, 10000, 1),
visit_date = sample(seq(as.Date('1980/01/01'), as.Date('2020/12/31'), by="day"), 10000),
var1 = round(runif(10000, min = 1, max = 500)),
var2 = round(runif(10000, min = 1, max = 1000)),
var3 = round(runif(10000, min = 1, max = 9000)),
stringsAsFactors = FALSE)
data_joined <-
dplyr::inner_join(visit_data, event_data_total, by = c('visit_person_id' = 'event_person_id')) %>%
arrange(visit_date)
data_joined_final <- data_joined %>%
filter(visit_date > event_date & visit_date < (event_date %m % years(2)))
我真的很感激任何幫助:)
uj5u.com熱心網友回復:
在幫助方面相當新,所以請憐憫;) 但據我所知,解決方案可能來自“data.table”“foverlaps”。通過重疊日期和 ID 連接。我不能 100% 確定您想要最終資料的確切程度,但這里有一個建議,您可以根據自己的特定需求進行修改。
library(dplyr)
library(lubridate)
library(data.table)
set.seed(123)
event_data <- data.frame(event_person_id = seq(1, 100, 1),
event_date = sample(seq(as.Date('1980/01/01'), as.Date('2010/12/31'), by="day"), 100),
age = round(runif(100, min = 1, max = 80)),
bmi = round(runif(100, min = 19, max = 30)),
amount = round(runif(100, min = 10, max = 10000)),
stringsAsFactors = FALSE)
event_data2 <- data.frame(event_person_id = seq(1, 10, 1),
event_date = sample(seq(as.Date('2011/01/01'), as.Date('2020/12/31'), by="day"), 10),
age = round(runif(10, min = 1, max = 80)),
bmi = round(runif(10, min = 19, max = 30)),
amount = round(runif(10, min = 10, max = 10000)),
stringsAsFactors = FALSE)
event_data_total <- rbind(event_data, event_data2)
visit_data <- data.frame(visit_person_id = round(runif(10000, min = 1, max = 100)),
visit_id = seq(1, 10000, 1),
visit_date = sample(seq(as.Date('1980/01/01'), as.Date('2020/12/31'), by="day"), 10000),
var1 = round(runif(10000, min = 1, max = 500)),
var2 = round(runif(10000, min = 1, max = 1000)),
var3 = round(runif(10000, min = 1, max = 9000)),
stringsAsFactors = FALSE)
#create the end dates 2 years
event_data_total$end_date <- event_data_total$event_date years(2)
#set as data.table
DT1 <- data.table(visit_data)
DT2 <- data.table(event_data_total)
#set joining keys
setkey(DT2, event_person_id, event_date, end_date)
#create dublicate columns with the same names, used for foverlaps
DT1[, c("event_date", "end_date") := visit_date]
DT1[, c("event_person_id") := visit_person_id]
#join data
data_joined<-foverlaps(DT1, DT2)
# now you should be able to sort it with e.g.
dat <- data_joined[complete.cases(data_joined), ]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/370315.html
