2012-11-26 48 views
5

我有一個這樣的名單:轉換列表以一行data.frame

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

對象列表中的數目是可變的。列表中的對象是矢量 - 只有一維對象。

我想打一個過程將列表轉換成一排data.frame這樣的:

> 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 

我目前這個解決方案:

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

哪裏b幾乎是結果我想實現:

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

兩個問題:

  1. 有沒有更優雅的方法來實現結果?
  2. 你有什麼想法如何獲得重複的姓名的編號,如c(n.1, n.2, n.3)

回答

4

如果你想保持列表中的對象的不同的數據類型,下面的命令可用於:

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

的輸出:

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

值i n列2到4仍然是數字。

+0

由於保留了數據類型而被接受 - 額外的功能我沒有問在問題中,但我正在考慮這個問題。令我吃驚的是,對象的命名是如何在R中組織的。在這兩個例子中,不同的行名被分配給相同的結果:'foo < - function(x)t(data.frame(x)); foo(arg0 [[1]])和't(data.frame(arg0 [[1]]))'。也不知道'lapply'保存了參數列表中的對象名稱。謝謝你的教育答案! – djhurio

4

您可以在轉置的未列出數據上使用write.tableread.table的組合。我已經使用剪貼板作爲保存表的中間步驟。

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

+1獲取自然數據類型 –

9

這是一種方式:

data.frame(t(unlist(arg0))) 
# code n1 n2 n3 
# 1 a 10 10 10