2014-09-30 23 views
5

Tôi có danh sách khung dữ liệu, cho mỗi danh sách, tôi có tên cho nó, là USERID, sau đây là một mẫu danh sách:Cách chuyển danh sách dataframe thành dataframe có cột mới hiển thị tên danh sách trong 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 

câu hỏi của tôi là làm thế nào để chuyển đổi danh sách này vào một khung dữ liệu trong đó có một cột mới cho thấy uSERID, giống như mẫu dưới đây:

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 

Bất cứ ý tưởng làm thế nào nó có thể được thực hiện. Cảm ơn bạn rất nhiều trước

+0

Hãy thử 'df <- do.call (rbind, l); df $ USERID <- gsub ("[.] \\ d", "", row.names (df)) 'if' l' là danh sách của bạn –

+1

Điều này đã được trả lời nhiều lần trước đó, ví dụ: [** tại đây **] (http://stackoverflow.com/questions/15162197/append-data-sets-create-new-column-identifying-which-data-set-it-came-from), [** tại đây **] (http://stackoverflow.com/questions/15162197/append-data-sets-create-new-column-identifying-which-data-set-it-came-from), [** đây ** ] (http://stackoverflow.com/questions/15214472/use-object-names-within-a-list-in-lapply-ldply), [** đây **] (http://stackoverflow.com/questions/25759336/how-to-tạo-a-new-cột-với-tên-trong-một-danh sách/25759940 # 25759940). – Henrik

Trả lời

6

Kể từ cbind tái chế đối số của nó với độ dài của vector dài nhất, bạn có thể thử

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 

nơi x

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

Tuyệt vời, vâng, đây chính xác là những gì tôi muốn đạt được! Cảm ơn, Richard. – SmithWang

+0

@ user3758587 - Tôi thực sự đã thay đổi nó ngay bây giờ. Bây giờ thì tốt hơn là –

+1

Tôi đã thử tập lệnh mới của bạn, nó cũng hoạt động tốt. Cảm ơn rất nhiều vì sự nỗ lực của bạn. Nhân tiện, tôi cũng đã thử phương pháp của David, data.table là cách nhanh hơn nhiều. – SmithWang

4

Hoặc (nếu l là danh sách của bạn)

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

Một cách khác, chúng tôi trong phiên bản phát triển của 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

Làm thế nào đến tôi không có 'unnest' trong phiên bản 0,1 của tôi 'tidyr'? –

+0

Tôi không biết chức năng mới này cho đến khi tôi thấy nó vào một ngày khác. Bạn cần có phiên bản github. 'unnest()' chưa chính thức được phát hành. https://github.com/hadley/tidyr/blob/master/man/unnest.Rd – jazzurro

+2

@jazzurro +1, Tốt hơn là hãy cho biết rằng trong bài đăng để làm rõ. 'library ('devtools'); install_github ('hadley/tidyr'); thư viện (tidyr) ' – akrun

Các vấn đề liên quan