2016-10-05 7 views
0

Data.tableは、私のようなテーブル持って参加し、左および集計/ CONCATENATE/GROUP_CONCAT

x = data.table(Id=c(1,1,2,3,3,4), Name=c("A", "A", "B", "C", "C", "D"), TxId=c(10, 11, 20, 30, 31, 40)) 
#Id Name TxId 
#1: 1 A 10 
#2: 1 A 11 
#3: 2 B 20 
#4: 3 C 30 
#5: 3 C 31 
#6: 4 D 40 

y = data.table(Name=c("A", "B", "B", "C"), Family=c("A-alpha", "B-beta", "B-gamma", "C-delta")) 
# Name Family 
#1: A A-alpha 
#2: B B-beta 
#3: B B-gamma 
#4: C C-delta 

私は左に参加し、連結を行うことができますが、私は唯一のX.

で、各行に1つの出力行をしたいです
# Left join X to Y on Name column 
xy = y[x, on="Name"] 
# Name Family Id TxId 
#1: A A-alpha 1 10 
#2: A A-alpha 1 11 
#3: B B-beta 2 20 
#4: B B-gamma 2 20 
#5: C C-delta 3 30 
#6: C C-delta 3 31 
#7: D  NA 4 40 

# Concatenate Family column 
xy[, Family:=paste0(Family, collapse=", "), by=c("Name", "TxId")] 
# Name   Family Id TxId 
#1: A   A-alpha 1 10 
#2: A   A-alpha 1 11 
#3: B B-beta, B-gamma 2 20 
#4: B B-beta, B-gamma 2 20 
#5: C   C-delta 3 30 
#6: C   C-delta 3 31 
#7: D    NA 4 40 

Bの余分な行を削除する方法を教えてください。私はId/TxId上でそれが一意であることを望みます。すなわち

# Name   Family Id TxId 
#1: A   A-alpha 1 10 
#2: A   A-alpha 1 11 
#3: B B-beta, B-gamma 2 20 
#5: C   C-delta 3 30 
#6: C   C-delta 3 31 
#7: D    NA 4 40 

私はエディとしてコメントを行う場合は、次の

xy[, .(Family=paste0(Family, collapse=", "), by=c("Name", "TxId")]) 

を私は正しい結果を得ることができます。しかし、私は他の列を追加しようとした場合、それは動作しません(私は:=バージョンを行っていたかのように、私は同じ結果を得る):

xy[, .(Id, Family=paste0(Family, collapse=", ")), by=c("Name", "TxId")] 
+0

新しい列を作成せず、代わりに 'xy [、family = paste0(...)] by by = ...]' – eddi

+0

'xy [、family(paste = – Uwe

+0

@UweBlock、いいえ、私はそれを試していませんでした。それは直感的ですが、それは動作します!私が作品を見つけたのはユニークですが、あなたのアプローチは約30%速くなっています。 –

答えて

1

xy[, .(Family = paste0(Family, collapse = ", "), by = c("Id", "Name", "TxId")] 

I'LLを試してみてください説明しを試してみてください。
Idは、グループによってそれの一部である場合のみ(TxIdNameIdの一意の組合せごとに、正確には)Idの一意の各値に対して一度表示されます。 Idjの式に含まれる場合、つまり.(Id, Family = paste0(Family, collapse = ", ")の場合、が集計されているにもかかわらず、Idのすべての行が結果セットに含まれます。

関連する問題