2016-06-03 19 views
6

Ho alcuni dati come il seguente:Combinare lista con il vettore in R

num = list() 
num[[1]] = c(1,2,3) 
num[[2]] = c(4,5,6,7) 
name = c("Alex", "Patrick") 

Come si combinano in un frame di dati che assomiglia a questo?

Alex  1 
Alex  2 
Alex  3 
Patrick  4 
Patrick  5 
Patrick  6 
Patrick  7 

Mi dispiace per la pubblicazione di quella che è probabilmente una domanda ovvia. Ho cercato estesamente e non ho trovato la risposta, probabilmente perché non so come descrivere bene questa query.

+3

'pila (setNames (num, nome))' – user20650

+0

@ user20650 aggiungono come risposta, nuova funzione del giorno - pila! – zx8754

+2

@ zx8754; ah, raramente me lo ricordo. .. ma penso che lo lascerò a bighellonare nei commenti, dato che sta facendo proprio quello che la risposta di Richard S fa, ma con i vestiti addosso. – user20650

risposta

8

Provatelo. La nuova funzione lengths() è utile qui.

data.frame(name = rep(name, lengths(num)), num = unlist(num)) 
#  name num 
# 1 Alex 1 
# 2 Alex 2 
# 3 Alex 3 
# 4 Patrick 4 
# 5 Patrick 5 
# 6 Patrick 6 
# 7 Patrick 7 

Per comprenderlo un po 'meglio, spezziamolo in parti dall'interno verso l'esterno. lengths() ci dice la lunghezza di ogni elemento in una lista, quindi abbiamo

lengths(num) 
# [1] 3 4 

Ora usiamo che come argomento times in rep() di replicare gli elementi di name.

rep(name, lengths(num)) 
# [1] "Alex" "Alex" "Alex" "Patrick" "Patrick" "Patrick" "Patrick" 

In modo che sia la prima colonna. Per la seconda colonna, basta convertire num in un vettore atomico con unlist().

unlist(num) 
# [1] 1 2 3 4 5 6 7 

Metti questi insieme come mostrato sopra e abbiamo il tuo nuovo data frame.

+0

Questo è geniale. Un po 'difficile seguire le funzioni annidate, ma penso di averlo capito. Grazie. –

+1

@AlexLach - Ho aggiunto qualche spiegazione. Spero che sia d'aiuto –

3

Un'altra opzione:

data.table::rbindlist(Map(function(x,y) data.frame(name = x, num = y), name, num)) 
     name num 
1: Alex 1 
2: Alex 2 
3: Alex 3 
4: Patrick 4 
5: Patrick 5 
6: Patrick 6 
7: Patrick 7 
2

Oppure possiamo usare stack dopo aver impostato la names di 'num' con 'nome'

stack(setNames(num, name))[2:1] 
#  ind values 
#1 Alex  1 
#2 Alex  2 
#3 Alex  3 
#4 Patrick  4 
#5 Patrick  5 
#6 Patrick  6 
#7 Patrick  7 

appena notato che questo è stato registrato nei commenti da @ user20650 . In questo caso, possiamo anche fare

library(reshape2) 
melt(setNames(num, name))[2:1] 
#  L1 value 
#1 Alex  1 
#2 Alex  2 
#3 Alex  3 
#4 Patrick  4 
#5 Patrick  5 
#6 Patrick  6 
#7 Patrick  7 
Problemi correlati