2015-10-16 139 views
6

我想弄清楚如何將data.frame或data.table添加到列表中的第一個位置。追加數據框到列表

理想情況下,我想結構如下列表:

List of 4 
$ :'data.frame': 1 obs. of 3 variables: 
    ..$ a: num 2 
    ..$ b: num 1 
    ..$ c: num 3 
$ d: num 4 
$ e: num 5 
$ f: num 6 

注意data.frame是列表的結構內的對象。

問題是,我需要在列表創建後將數據框添加到列表中,並且數據框必須是列表中的第一個元素。我想做到這一點使用一些簡單的像append,但是當我嘗試:

append(list(1,2,3),data.frame(a=2,b=1,c=3),after=0) 

我得到結構的列表:

str(append(list(1,2,3),data.frame(a=2,b=1,c=3),after=0)) 
List of 6 
$ a: num 2 
$ b: num 1 
$ c: num 3 
$ : num 1 
$ : num 2 
$ : num 3 

看來,R爲強迫data.frame成一個列表當我試圖append。我如何阻止它這樣做?或者可能有什麼替代方法來構建這個列表,在列表初始創建後,將data.frame插入位置1的列表中。

+0

理查德,這不是我想要做的。我正在嘗試將一個對象添加到已經定義的列表中。是的,我可以重新定義整個列表,但我希望不需要那樣做。我想要做的是儘可能少地插入一個對象到列表中。這份清單相當長,我寧願不以這種方式重組整個清單。我確實看到你使用append作爲向量設計的觀點,但它似乎應該有一個對應的函數列表,不是嗎? – Tom

+0

就是這樣!您能否將您的評論移至答案中,以便將其標記爲已選中? – Tom

+0

更好的標題可能是「預先列出」或其他內容。這似乎與data.table沒有特別的關係,也沒有真正的追加。 – Frank

回答

10

您遇到的問題是要將數據框放到列表中的任何位置作爲單個列表元素,它必須用list()包裝。我們來看一下。

df <- data.frame(1, 2, 3) 
x <- as.list(1:3) 

如果我們只是c()包裹,這是append()是引擎蓋下做的,我們得到

c(df) 
# $X1 
# [1] 1 
# 
# $X2 
# [1] 2 
# 
# $X3 
# [1] 3 

但是,如果我們在list()包裹它,我們得到一個包含數據幀所需的列表元素。

list(df) 
# [[1]] 
# X1 X2 X3 
# 1 1 2 3 

因此,由於x已經是一個列表,我們將需要使用以下構造。

c(list(df), x) ## or append(x, list(df), 0) 
# [[1]] 
# X1 X2 X3 
# 1 1 2 3 
# 
# [[2]] 
# [1] 1 
# 
# [[3]] 
# [1] 2 
# 
# [[4]] 
# [1] 3 
+0

這工作得很好。謝謝。 FWIW也似乎與data.table一起玩得很好。 – Tom