2015-10-16 69 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