2012-11-26 37 views
5

tôi có một danh sách như thế này:Chuyển đổi một danh sách để một hàng data.frame

arg0 <- list(code = "a", n = rep(10, 3)) 

Số lượng các đối tượng trong danh sách có thể thay đổi. Các đối tượng của danh sách là các vectơ - chỉ các đối tượng một chiều.

Tôi muốn thực hiện một thủ tục để chuyển đổi danh sách để một data.frame một dòng như thế này:

> data.frame(code = "a", n.1 = 10, n.2 = 10, n.3 = 10) 
    code n.1 n.2 n.3 
1 a 10 10 10 

tôi có hiện giải pháp này:

a <- stack(arg0) 
b <- data.frame(t(a[,1])) 
names(b) <- a[,2] 
b <- data.frame(b) 

đâu b hầu như kết quả Tôi muốn đạt được:

> b 
    code n n.1 n.2 
1 a 10 10 10 

Hai câu hỏi:

  1. Có cách nào thanh lịch hơn để đạt được kết quả không?
  2. Bạn có biết cách đánh số các tên trùng lặp giống như c(n.1, n.2, n.3) không?

Trả lời

4

Nếu bạn muốn giữ lại các kiểu dữ liệu khác nhau của các đối tượng của danh sách, lệnh sau đây có thể được sử dụng:

data.frame(lapply(arg0, function(x) t(data.frame(x)))) 

Sản lượng:

code n.1 n.2 n.3 
x a 10 10 10 

Giá trị i n cột hai đến bốn vẫn là số.

+0

Được chấp nhận vì bảo quản các kiểu dữ liệu - tính năng bổ sung mà tôi không hỏi trong câu hỏi nhưng tôi đã suy nghĩ về nó. Điều ngạc nhiên đối với tôi là cách đặt tên của các đối tượng được tổ chức theo R. Các tên hàng khác nhau được gán cho cùng một kết quả trong hai ví dụ sau: 'foo <- function (x) t (data.frame (x)); foo (arg0 [[1]]) 'và' t (data.frame (arg0 [[1]])) '. Cũng không biết rằng 'lapply' duy trì tên đối tượng từ danh sách đối số. Cảm ơn bạn đã giáo dục câu trả lời! – djhurio

4

Bạn có thể sử dụng kết hợp write.tableread.table trên dữ liệu không công khai được chuyển đổi. Tôi đã sử dụng khay nhớ tạm làm bước trung gian để giữ bảng.

write.table(t(unlist(arg0)),"clipboard") 
read.table("clipboard") 
    code n1 n2 n3 
1 a 10 10 10 
+0

+1 để nhận các kiểu dữ liệu tự nhiên –

9

Đây là một cách:

data.frame(t(unlist(arg0))) 
# code n1 n2 n3 
# 1 a 10 10 10 
Các vấn đề liên quan