2017-08-08 46 views
1

我發佈了一個問題,有關加入data.table中的列,其中一列(dep)具有條目的依賴信息。因此條目3依賴於標籤爲'40'的記錄。然後,'匹配'列被分配條目所依賴的標籤的標識符值。問題是張貼在這裏:Comparing columns uptill certain index in R加入data.table與多個匹配

library(data.table) 
trace <- data.table(id=1:10, dep=c(-1,45,40,47,0,45,43,42,45,45), 
label=c(99,40,43,45,47,42,48,45,52,67), mark=rep("",10)) 
    id dep label mark 
1: 1 -1 99  
2: 2 45 40  
3: 3 40 43  
4: 4 47 45  
5: 5 0  47  
6: 6 45 42  
7: 7 43 48 
8: 8 42 45  
9: 9 45 52  
10: 10 45 67 

會導致

id dep label mark 
1: 1 -1 99 1  
2: 2 45 40 2 
3: 3 40 43 2 
4: 4 47 45 4 
5: 5 0  47 5 
6: 6 45 42 4 
7: 7 43 48 3 
8: 8 42 45 6 
9: 9 45 52 8 
10: 10 45 67 8 

以下解決方案爲我工作:

trace[, mark := trace[.(dep = dep, id = id), on=.(label = dep, id < id), mult="last", x.id]] 

# if not found, use current id 
trace[is.na(mark), mark := id ] 

針對上述案例,對於重複我們使用的最最近的比賽。 然而,如果不是匹配到最後一個條目,如果我想保留的所有比賽,有沒有辦法得到類似這樣的輸出(其中最後和倒數第二項有多個依賴):

id dep label mark 
1: 1 -1 99 1  
2: 2 45 40 2 
3: 3 40 43 2 
4: 4 47 45 4 
5: 5 0  47 5 
6: 6 45 42 4 
7: 7 43 48 3 
8: 8 42 45 6 
9: 9 45 52 4,8 
10: 10 45 67 4,8 

我不是關注這些依賴關係被記錄的格式。使用MULT = 「所有」 早期解決方案的一個稍微的改變,

trace[, mark := trace[.(dep = dep, id = id), on=.(label = dep, id < id), mult="all", toString(x.id)]] 

結果在這個

id dep label         mark 
1: 1 -1 99 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8 
2: 2 45 40 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8 
3: 3 40 43 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8 
4: 4 47 45 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8 
5: 5 0 47 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8 
6: 6 45 42 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8 
7: 7 43 48 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8 
8: 8 42 45 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8 
9: 9 45 52 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8 
10: 10 45 67 NA, NA, 2, NA, NA, 4, 3, 6, 4, 8, 4, 8 

回答

3

好,略作修改:

trace[, mark := trace[.(dep = dep, id = id), on=.(label = dep, id < id), 
    if (all(is.na(x.id))) NA_character_ else toString(x.id), by=.EACHI]$V1 ] 

# if not found, use current id 
trace[is.na(mark), mark := as.character(id) ] 

它採用as.character(id)因爲mark現一個字符串變量。

怎麼看by=.EACHI工作,嘗試在自己運行此部分:

trace[.(dep = dep, id = id), on=.(label = dep, id < id), 
    if (all(is.na(x.id))) NA_character_ else toString(x.id), by=.EACHI] 

評論。我預計這對於較大的表格不會很好地擴展。此外,列不再匹配id的類型,所以它不能被用來合併等。list -class列將有同樣的問題:

trace[, mark := trace[.(dep = dep, id = id), on=.(label = dep, id < id), 
    list(list(na.omit(x.id))), by=.EACHI]$V1 ] 

# if not found, use current id 
trace[lengths(mark) == 0L, mark := as.list(id)] 
+1

它的工作對正常的測試案例。但是,對於實際的百萬行記錄 - 正如你所提到的 - 不起作用。 – Saltaf