2016-05-18 61 views
1

我想使用datatable的frank函數按id排列日期列。但是,我的排名似乎只考慮日期列,而不是與其對應的ID。我也收到這些警告,我是不知道的6:r數據表中由另一個變量分組的排序值

1 ..... 6:[.data.table(DUP的,:=(等級,弗蘭克(DUP的,日期,ties.method =「平均「)),:。 RHS 1是長度爲10(比第6組的尺寸(1)更大)的最後9族元素(一個或多個)將被丟棄

dups <- data.table (id = c('11', '11', '11', '22','22', 
    '88', '99','44','44', '55'), 
    date = mdy(c("1-01-2016", "1-02-2016", "1-02-2016","2-01-2016", 
    "2-02-2016"))) 

so.sample <- dups[, rank := frank(dups, date, ties.method = "average"), by = id] 

例如,ID = 11和日期= 2016-01-01應該排名1而不是1.5,因爲這個組合只有一個ID和日期。

thx求助

回答

5

它在'排名'和'坦率'兩方面都很好。也許你的日期變量格式不正確。下面是代碼:

dt1 <- data.table (id = c('11', '11', '11', '22','22', 
         '88', '99','44','44', '55'), 
       date = as.Date(c("01-01-2016", 
           "01-02-2016", 
           "01-02-2016", 
           "02-01-2016", 
           "02-02-2016"), 
           format = "%m-%d-%Y")) 
setkey(dt1, date) 
setkey(dt1, id) 
dt1 

    id  date 
1: 11 2016-01-01 
2: 11 2016-01-02 
3: 11 2016-01-02 
4: 22 2016-02-01 
5: 22 2016-02-02 
6: 44 2016-01-02 
7: 44 2016-02-01 
8: 55 2016-02-02 
9: 88 2016-01-01 
10: 99 2016-01-02 

dt1[, rank := frank(date), 
    by = list(id)] 
dt1 

    id  date rank 
1: 11 2016-01-01 1.0 
2: 11 2016-01-02 2.5 
3: 11 2016-01-02 2.5 
4: 22 2016-02-01 1.0 
5: 22 2016-02-02 2.0 
6: 44 2016-01-02 1.0 
7: 44 2016-02-01 2.0 
8: 55 2016-02-02 1.0 
9: 88 2016-01-01 1.0 
10: 99 2016-01-02 1.0 

此外,如果你只是想列舉你的記錄,使用.N可以說是相當有幫助的:

dt1[, Visit := 1:.N, 
    by = list(id)] 
dt1 

    id  date rank Visit 
1: 11 2016-01-01 1.0  1 
2: 11 2016-01-02 2.5  2 
3: 11 2016-01-02 2.5  3 
4: 22 2016-02-01 1.0  1 
5: 22 2016-02-02 2.0  2 
6: 44 2016-01-02 1.0  1 
7: 44 2016-02-01 2.0  2 
8: 55 2016-02-02 1.0  1 
9: 88 2016-01-01 1.0  1 
10: 99 2016-01-02 1.0  1 

我希望這有助於。

相關問題