2015-07-15 15 views
8

Eliminare la colonna dell'elenco nidificato in data.table. Supponendo che tutti gli elementi dell'elenco siano dello stesso tipo. Gli elementi della lista sono nominati, il nome deve essere gestito anche.
È un'operazione in qualche modo opposta a data.table aggregation to list column.
Penso valga la pena averlo nella knowledge base SO .
Il mio attuale approccio al workaround, sto cercando una risposta un po 'più canonica.Eliminare le colonne dell'elenco nidificato in data.table

library(data.table) 
dt <- data.table(
    a = letters[1:3], 
    l = list(list(c1=6L, c2=4L), list(x=2L, y=4L, z=3L), list()) 
) 
dt[] 
# a  l 
# 1: a <list> 
# 2: b <list> 
# 3: c <list> 
dt[,.(a = rep(a,length(l)), 
     nm = names(unlist(l)), 
     ul = unlist(l)), 
    .(id = seq_along(a)) 
    ][, id := NULL 
    ][] 
# a nm ul 
# 1: a c1 6 
# 2: a c2 4 
# 3: b x 2 
# 4: b y 4 
# 5: b z 3 
# 6: c NA NA 
+0

non puoi semplicemente fare 'dt [, (nm = nomi (non elencati (l)), ul = non elencati (l)), da = a.]'? –

+1

L'ultima riga, che ha una lista vuota, non è gestita in questo modo. – jangorecki

+0

@jangorecki, anche le liste vuote sono sempre senza nome? – A5C1D2H2I1M1N2O1R2T1

risposta

8
Non

sicuro che è più "canonica", ma ecco un modo per modificare l modo da poter utilizzare by=a, considerando che si conosce il tipo di dati nella lista (con alcuni miglioramenti, grazie alla @DavidArenburg):

dt[lengths(l) == 0, l := NA_integer_][, .(nm = names(unlist(l)), ul = unlist(l)), by = a] 

# a nm ul 
#1: a c1 6 
#2: a c2 4 
#3: b x 2 
#4: b y 4 
#5: b z 3 
#6: c NA NA 
+0

da dove viene la funzione 'lengths'? oh, nm, vedo che è lì nelle nuovissime versioni R – eddi

+0

@eddi, tbh la linea originale era con 'lapply (l, length)', l'uso di 'lengths 'è parte dei miglioramenti suggeriti da David Arenburg ;-) – Cath

Problemi correlati