2016-08-04 43 views
1

Der folgende Code erstellt zwei Datentabellen mit der gleichen Spalte id_g, die auf verschiedene Arten dargestellt wird.R: Zusammenführen von data.tables zum Erstellen verschachtelter data.table mit Liste für jede Zeile

table1 <- data.table(id=c(1:3), id_g = vector('list', 3L)) 
set(table1, j='id_g', value=list(c(1:3), c(4:6), 7)) 
table1 
# id | id_g 
# 1 | 1,2,3 
# 2 | 4,5 
# 3 | 6,7 

table2 <- data.table(id_g = c(1:7), id_values = vector('list', 7L)) 
set(table2, j='id_values', value= list(c(1:5), c(1:2), 1, 2, c(3:5), 3, c(1:2))) 
table2 
# id_g | id_values 
# 1  | 1,2,3,4,5 
# 2  | 1,2 
# 3  | 1 
# 4  | 2 
# 5  | 3,4,5 
# 6  | 3 
# 7  | 1,2 

Erwartetes Ergebnis:

table_all 
# id | id_g 
# 1 | <data.table> 
# 2 | <data.table> 
# 3 | <data.table> 

wo beispielsweise data.table für ID = 1 ist eine Liste von drei Vektoren: c (1: 5), C (1,2), 1.

Was ist der effizienteste Weg, Tabellen durch id_g zu verbinden und geschachtelte Tabellen für jede ID zu erstellen? Verschachtelte Tabellen sollten eine Liste von separaten Vektoren mit möglicherweise unterschiedlicher Länge sein.

+2

Sie mögen 'table2 etwas tun könnten [table1 [(id_g = as.integer (fehlende oder (id_g))), durch = id], id:. = i.id, auf = "id_g"] [,. (. (id_values)), by = id] 'mit' data.table'. Nicht sicher, wie effizient es ist –

Antwort

1

Es ist verpflichtet, ein besserer Weg sein, um die Reihen von table2 weicht auszuwählen haben id_g %in% v, aber versuchen, dies für einen Start:

table_all <- table1 
table_all$id_g <- lapply(table_all$id_g, function(v){table2[id_g %in% v,id_values]}) 
table_all 
# id id_g 
#1: 1 <list> 
#2: 2 <list> 
#3: 3 <list> 
table_all$id_g[1] 
#[[1]] 
#[[1]][[1]] 
#[1] 1 2 3 4 5 
# 
#[[1]][[2]] 
#[1] 1 2 
# 
#[[1]][[3]] 
#[1] 1 

so ziemlich die gleichen, mit id_gdata.table Elementen statt list mit:

table_all <- table1 
table_all$id_g <- lapply(table_all$id_g, function(v){data.table(table2[id_g %in% v,id_values])}) 
table_all 
# id   id_g 
#1: 1 <data.table> 
#2: 2 <data.table> 
#3: 3 <data.table> 
table_all$id_g[1] 
#[[1]] 
#   V1 
#1: 1,2,3,4,5 
#2:  1,2 
#3:   1 
+0

Danke für die schnelle Reaktion auf meine Frage. Können Sie mir sagen, ob es einen Unterschied macht, die Liste der Vektoren als Liste statt in data.table zu speichern? – user3463225

+0

@ user3463225 Für alle Absichten und Zwecke, die ich mir vorstellen kann, nein. Beachten Sie, dass übliche data.frames als Listen von Listen (von gleicher Länge) implementiert werden. Daher ist es einfach, die von 'table2 [...]' generierte Liste in eine dat.frame oder data.table mit einer Spalte zu schreiben. EDIT: Es ist nur ein bisschen schöner :) (siehe meine Bearbeitung) – AlexR

+0

Könnten Sie auch erklären, wie Vektoren innerhalb jeder data.table in separate Spalten aufgeteilt werden können? – user3463225