将列表附加到R中的数据框

时间:2012-10-05 06:33:37

标签: r list dataframe append rbind

我在R中创建了一个空数据框,其中包含两列:

d<-data.frame(id=c(), numobs=c())

我想将此数据框(在循环中)附加一个包含输出的列表d1

[1] 1  100

我尝试使用rbind

d<-rbind(d, d2)

merge

d<-merge(d, d2)

我甚至尝试制作一个列表列表,然后将其转换为数据帧,然后给出该数据帧名称:

d<-rbind(dlist1, dlist2)
dframe<-data.frame(d)
names(dframe)<-c("id","numobs")

但这些似乎都不符合例行检查程序的标准(这是针对一个类),这给出了错误:

Error: all(names(cc) %in% c("id", "nobs")) is not TRUE

即使它在我的工作区中工作正常。

这很令人沮丧,因为错误并未显示错误发生的位置。

任何人都可以帮我合并2个数据框或将数据框附加到列表中吗?

3 个答案:

答案 0 :(得分:1)

正在将d2对象打印为原子矢量。既然你没有向我们展示dput(d2)或str(d2),我们有充分的理由相信你不理解R列表。此外,第一位代码也不会产生两列数据帧。

> d<-data.frame(id=1, numobs=1)[0, ]             # 2-cl dataframe with 0 rows
> dput(d)
structure(list(id = numeric(0), numobs = numeric(0)), .Names = c("id", 
"numobs"), row.names = integer(0), class = "data.frame")
> d2 <- list(id="fifty three", numobs=6)          # names that match names(d)
> rbind(d,d2)
           id numobs
2 fifty three      6

答案 1 :(得分:1)

对于初学者,例程检查器似乎正在查找标有“id”和“nobs”的列。如果这与您的文件输出不匹配,您将收到该错误。

我正在采取可能是同一个类并且具有相同的错误;纠正我的列名已经消失了(我将第二个标记为“nob”而不是“nobs”!)现在我已经让例程检查器正确完成,或者看起来好像......但它输出三个数据文件,第一个和最后一个文件是正确的,但第二个文件产生“抱歉,这是不正确的”。没有进一步的反馈狂揽!

没有必要在这里发布我的代码,因为它在本地运行的所有课程示例都很好,当你不知道脚本要求什么时,它很难调试。叹息。

答案 2 :(得分:0)

我认为你混淆了rbindmerge的目的。 rbind附加data.frames或命名列表,或同时附加垂直。虽然merge将data.frames 水平组合

您似乎也被vectorlist混淆了。在R中,list可以为每个元素采用不同的数据类型,而vector必须使所有元素具有相同的类型。 listvector都是一维的。当您使用rbind时,您想附加一个名为 list一个名为/未命名的vector

未命名的向量和列表

您定义vector的方式是使用c()功能。您定义未命名列表的方式是使用list()函数,如下所示:

vec1 = c(1, 10)
# > vec1
# [1]  1 10

list1 = list(1, 10)
# > list1
# [[1]]
# [1] 1
# 
# [[2]]
# [1] 10

请注意,vec1list1都有两个元素,但list1将两个数字存储为两个单独的向量(元素[[1]]向量c(1)[[2]]向量c(10)

命名向量和列表

您还可以创建命名向量和列表。你这样做:

vec2 = c(id = 1, numobs = 10)
# > vec2
# id numobs 
# 1     10

list2 = list(id = 1, numobs = 10)
# > list2
# $id
# [1] 1
# 
# $numobs
# [1] 10

两者的数据结构相同,但这些元素都是命名的。

数据框作为列表

请注意,list2在每个元素名称前面都有$。这可能会为您提供data.frame实际上list的一些线索,每列都是list的一个元素,因为df$column通常用于从中提取列数据帧。这是有道理的,因为listdata.frame都可以采用不同的数据类型,与vectors不同。

rbind函数

当您的第一个元素是数据框时,rbind要求您附加的内容与数据框的列具有相同的名称。现在,命名vector不起作用,因为vector的元素不被视为数据帧的列,而名称list如果名称相同则匹配具有列的元素:

演示:

d<-data.frame(id=c(), numobs=c())

rbind(d, c(1, 10))
#   X1 X10
# 1  1  10

rbind(d, c(id = 1, numobs = 10))
#   X1 X10
# 1  1  10

rbind(d, list(1, 10))
#   X1 X10
# 1  1  10

rbind(d, list(id = 1, numobs = 10))
#   id numobs
# 1  1     10

了解上述内容后,很明显您也可以rbind两个列名匹配的数据帧:

df2 = data.frame(id = 1, numobs = 10)

rbind(d, df2)
#   id numobs
# 1  1     10