2013-05-19 17 views
5

Mam listę i chciałbym przekonwertować go do data.frame z dwiema kolumnami. Problemem jest to, że długość elementów listy nie jest równa, tutaj jest przykładem tego, jak wygląda moje dane:Przywróć efekt podziału na liście

my.list 

$A1CF 
[1] "A1CF" "APOBEC1" "CUGBP2" "KHSRP" "SYNCRIP" "TNPO2" 

$A2LD1 
[1] "A2LD1" "PRPSAP2" "RPL15" "TANC1" 

$A2M 
[1] "A2M"  "ADAM19" "ADAMTS1" "AMBP"  "ANXA6" "APOE" 

Ta lista pochodzi z poprzedniej data.frame:

my.list <- split(df$V2, df$V1) 

df 
     V1  V2 
1 A1BG A1BG 
2 A1BG CRISP3 
3 A1CF A1CF 
4 A1CF APOBEC1 
5 A1CF CUGBP2 
6 A1CF KHSRP 
7 A1CF SYNCRIP 
8 A1CF TNPO2 
9 A2LD1 A2LD1 
10 A2LD1 PRPSAP2 
11 A2LD1 RPL15 
12 A2LD1 TANC1 
13 A2M  A2M 
14 A2M ADAM19 
15 A2M ADAMTS1 
16 A2M AMBP 
17 A2M ANXA6 
18 A2M APOE 

gdzie elementy odpowiadające AB1G zostały usunięte. Chciałbym przywrócić podziału efekt aby uzyskać taką samą strukturę:

new.df 
A1CF A1CF 
A1CF APOBEC1 
A1CF CUGBP2 
A1CF KHSRP 
A1CF SYNCRIP 
A1CF TNPO2 
A2LD1 A2LD1 
A2LD1 PRPSAP2 
A2LD1 RPL15 
A2LD1 TANC1 
A2M  A2M 
A2M ADAM19 
A2M ADAMTS1 
A2M AMBP 
A2M ANXA6 
A2M APOE 

Próbowałem z: df.new <- do.call(rbind, my.list), ale oczywiście to nie działa.

Dziękujemy

+0

lubiłem @baptiste odpowiedź. Chciałbym także zasugerować, abyś zapoznał się z pakietem 'plyr' jako ogólną strukturą do robienia tego typu operacji dzielenia/stosowania/łączenia naraz. – flodel

Odpowiedz

5

Stosując te fikcyjne dane,

ll <- list(a = letters[3:6], 
      b = LETTERS[1:10], 
      c = letters[1:2]) 

stack(ll) 

lub

reshape2::melt(ll, id=1) 

lub

plyr::ldply(ll, cbind) 

powinno dać mniej więcej odpowiedni format

+0

Drogi @ Baptiste, bardzo dziękuję za odpowiedź, ale coś "zabawnego" dzieje się, gdy usuwam niektóre przedmioty z mojej listy, a następnie odwracam efekt podziału z Ldply. Jeśli powrócę do podzielonego pliku, a następnie przeprowadziłem analizę, usunięte pliki pojawią się ponownie ... – user2380782

+6

Nie ma mowy, żebym mógł odpowiedzieć na to, nie będąc za twoim ramieniem, obserwując ekran komputera, zdajesz sobie sprawę. Jeśli masz nowy problem, opublikuj kompletny i minimalnie odtwarzalny przykład jako nowe pytanie. – baptiste

2

Jeśli masz listę wektorów, @baptiste zapewnia bardziej zwięzłe i ogólne odpowiedzi dla listy.

Można również zastosować unsplit, operację odwrotną split.

options(stringsAsFactors = FALSE) 
df <- data.frame(V1 = c('A1BG', 'A1BG', 'A1CF', 'A1CF', 'A1CF', 'A1CF', 'A1CF', 'A1CF', 
         'A2LD1', 'A2LD1', 'A2LD1', 'A2LD1', 'A2M', 'A2M', 'A2M', 'A2M', 
         'A2M', 'A2M'), 
       V2 = c('A1BG', 'CRISP3', 'A1CF', 'APOBEC1', 'CUGBP2', 'KHSRP', 'SYNCRIP', 
         'TNPO2', 'A2LD1', 'PRPSAP2', 'RPL15', 'TANC1', 'A2M', 'ADAM19', 
         'ADAMTS1', 'AMBP', 'ANXA6', 'APOE')) 
my.list <- split(df$V2, df$V1) 
newdat <- data.frame(V1=df$V1, V2=unsplit(my.list, df$V1)) 

Jeśli masz listę data.frame od Splitu unsplit powinny być odpowiednie.

my.list <- split(df, df$V1) 
newdf <- unsplit(my.list[!names(my.list) %in% 'A1BG'], df$V1[!df$V1 %in% 'A1BG']) 

lub

newdf <- do.call(rbind, my.list[!names(my.list) %in% 'A1BG']) 
+0

+1 również zauważ, że jeśli użyjesz 'drop = TRUE' przy podsekcji' df $ V1', nie musisz podawać 'stringsAsFactors = FALSE'. –