2017-08-08 14 views
1

data.tableの列を結合する方法については以前質問がありましたが、1つの列(dep)にはエントリの依存情報があります。したがって、エントリ3はラベル '40'のレコードに依存します。次に、 'match'カラムには、エントリが依存するラベルのid値が割り当てられます。質問はここに掲載されています複数の一致を持つdata.tableに参加

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 ] 

上記のケースでは、我々はほとんどを使用していた重複の:Comparing columns uptill certain index in R

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 

につながります最近の試合。代わりに、最後のエントリに一致すると、私はすべての一致を維持したい場合場合 しかし、方法は、(最後と最後から二番目のエントリは、複数の依存関係を持っている)、このような出力を得ることがあります:

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使用して、以前のソリューションのわずかな変更、この

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

[OK]を、わずかな修正で

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

結果は:markは今as.character(id)ので

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) ] 

それは使用しています文字列変数。

自身でこの部分を実行してみて、どのように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級の列をマージするために使用することはできません。

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

関連する問題