簡體   English   中英

不允許使用日期滾動嗎?

[英]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函數),但是相關的列是subjectdate

我發現的每個主題的第一次教堂探訪

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_churchtest_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM