[英]R roll using dates not allowed?
為了創建一張桌子,我需要將人們對一個地方(例如教堂)的訪問與對另一個地方(例如商店)的訪問進行匹配。 在這個簡化的示例中,我需要找到人們第一次去教堂,以及在每次教堂拜訪之前最后一次去商店。 因此給定
> test_church=data.table(subject=as.factor(c('S_01','S_01','S_02','S_02')),
date=as.Date(c('2018-01-15','2018-01-29','2018-01-08','2018-01-22')),
key='subject')
> test_shop=data.table(subject=as.factor(c('S_01','S_02','S_01','S_02',
'S_01','S_02','S_01','S_02')),
date=as.Date(c('2018-01-03','2018-01-7',
'2018-01-11','2018-01-14',
'2018-01-17','2018-01-20',
'2018-01-23','2018-01-26')),
key='subject')
> str(test_church)
Classes ‘data.table’ and 'data.frame': 4 obs. of 2 variables:
$ subject: Factor w/ 2 levels "S_01","S_02": 1 1 2 2
$ date : Date, format: "2018-01-15" "2018-01-29" ...
- attr(*, "sorted")= chr "subject"
- attr(*, ".internal.selfref")=<externalptr>
> str(test_shop)
Classes ‘data.table’ and 'data.frame': 8 obs. of 2 variables:
$ subject: Factor w/ 2 levels "S_01","S_02": 1 1 1 1 2 2 2 2
$ date : Date, format: "2018-01-03" "2018-01-11" ...
- attr(*, "sorted")= chr "subject" "date"
- attr(*, ".internal.selfref")=<externalptr>
教堂參觀,我所尋找的是"2018-01-15"
為S_01
和"2018-01-08"
為S_02
和那些之前相應的最后一個車間參觀是"2018-01-11"
為S_01
之前(最后"2018-01-15"
S_02
(最后"2018-01-08"
之前)的"2018-01-07"
"2018-01-15"
)和"2018-01-07"
。
我的實際表要大得多(這就是為什么我想使用data.table函數),但是相關的列是subject
和date
。
我發現的每個主題的第一次教堂探訪
first_church = test_church[ J(unique(subject)), on = 'subject', mult = 'first' ]
但是當我想找到對應的商店訪問時
church_shop = test_shop[ first_church, on='date', roll=T ]
我懂了
> church_shop
subject date i.subject
1: S_02 2018-01-15 S_01
2: S_02 2018-01-08 S_02
因此,我沒有在正確的訪問中找到日期,而是在新表格中得到了一個甚至不正確的主題列表! ( S_02
在"2018-01-15"
上不執行任何操作)。 如果將first_church
和test_shop
的鍵都設置為c('subject','date')
, test_shop
發生相同的事情。
有沒有一種方法可以通過聯接執行此操作,還是應該只編寫一個for循環?
添加應該是第一次訪問教堂的更快方法,並結合弗蘭克的評論來獲得所需的輸出:
#get first church visit
setorder(test_church, subject, date)
first_church <- test_church[test_church[, .I[1L], by=.(subject)]$V1]
#rolling join with Frank's fix
test_shop[first_church, .(x.subject, x.date), on=c("subject", "date"), roll=TRUE]
輸出:
x.subject x.date
1: S_01 2018-01-11
2: S_02 2018-01-07
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.