2014-09-30 14 views
5

Mam listę ramek danych, dla każdej listy mam nazwę dla niej, która jest identyfikatorem USERID, następującą jest próbka z listy:Jak przekonwertować listę ramek danych na ramkę danych, która ma nową kolumnę, wyświetlać nazwę listy w R

$'AAAAAA' 
AA BB CC 
a b 1 
c d 2 
e f 3 
S'BBBBBB' 
AA BB CC 
g h 1 
i j 2 
k l 3 

Moje pytanie brzmi: w jaki sposób przekonwertować tę listę do ramki danych, który ma nową kolumnę pokazując identyfikator użytkownika, jak na poniższym przykładzie:

AA BB CC USERID 
a b 1 AAAAAA 
c d 2 AAAAAA 
e f 3 AAAAAA 
g h 1 BBBBBB 
i j 2 BBBBBB 
k l 3 BBBBBB 

jakiś pomysł jak go może być zrobione. Dziękuję bardzo z góry

+0

Spróbuj 'df <- do.call (rbind, l); df $ USERID <- gsub ("[.] \\ d", "", row.names (df)) 'jeśli' l' jest twoją listą –

+1

Odpowiedzi udzielono już kilka razy, np. [** tutaj **] (http://stackoverflow.com/questions/15162197/append-data-sets-create-new-column-identifying-which-data-set-it-came-from), [** tutaj **] (http://stackoverflow.com/questions/15162197/append-data-sets-create-new-column-identifying-which-data-set-it-came-from), [** tutaj ** ] (http://stackoverflow.com/questions/15214472/use-object-names-within-a-list-in-lapply-ldply), [** tutaj **] (http://stackoverflow.com/questions/25759336/how-to-create-a-new-column-with-names-in-a-list/25759940 # 25759940). – Henrik

Odpowiedz

6

Od cbind przetwarza swoje argumenty do długości najdłuższego wektorze, można spróbować

Reduce(rbind, Map(cbind, x, USERID = names(x))) 
# AA BB CC USERID 
# 1 a b 1 AAAAA 
# 2 c d 2 AAAAA 
# 3 e f 3 AAAAA 
# 4 g h 1 BBBBB 
# 5 i j 2 BBBBB 
# 6 k l 3 BBBBB 

gdzie x jest

structure(list(AAAAA = structure(list(AA = c("a", "c", "e"), 
    BB = c("b", "d", "f"), CC = 1:3), .Names = c("AA", "BB", 
"CC"), class = "data.frame", row.names = c(NA, -3L)), BBBBB = structure(list(
    AA = c("g", "i", "k"), BB = c("h", "j", "l"), CC = 1:3), .Names = c("AA", 
"BB", "CC"), class = "data.frame", row.names = c(NA, -3L))), .Names = c("AAAAA", 
"BBBBB")) 
+0

Niesamowite, tak, właśnie to chcę osiągnąć! Dzięki, Richard. – SmithWang

+0

@ user3758587 - Właściwie to zmieniłem właśnie teraz. Teraz jest lepiej –

+1

Próbowałem twojego nowego skryptu, działa również. dziękuję bardzo za Twój wysiłek. Przy okazji, również wypróbowałem metodę Davida, dane są dużo szybsze. – SmithWang

4

lub (jeśli l jest lista)

library(data.table) 
rbindlist(Map(cbind, l, USERID = names(l))) 
# AA BB CC USERID 
# 1: a b 1 AAAAAA 
# 2: c d 2 AAAAAA 
# 3: e f 3 AAAAAA 
# 4: g h 1 BBBBBB 
# 5: i j 2 BBBBBB 
# 6: k l 3 BBBBBB 
6

Inny sposób, nas w wersji rozwojowej: tidyr:

# install.packages("devtools") 
devtools::install_github("hadley/tidyr") 
library(tidyr) 

unnest(mylist, USERID) 
# USERID AA BB CC 
# 1 AAAAA a b 1 
# 2 AAAAA c d 2 
# 3 AAAAA e f 3 
# 4 BBBBB g h 1 
# 5 BBBBB i j 2 
# 6 BBBBB k l 3 
+0

Dlaczego nie mam "unnest" w mojej 0.1 wersji 'tidyr'? –

+0

Nie znałem tej nowej funkcji, dopóki nie zobaczyłem jej tamtego dnia. Musisz pobrać wersję Github. 'unnest()' nie jest jeszcze oficjalnie wydane. https://github.com/hadley/tidyr/blob/master/man/unnest.Rd – jazzurro

+2

@jazzurro +1, Lepiej pokazać to w poście, aby było jasne. 'biblioteka ('devtools'); install_github ('hadley/tidyr'); library (tidyr) ' – akrun

Powiązane problemy