在R中将列表添加到数据框

5

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

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

我想在循环中使用列表 d1 向此数据框追加数据,输出如下:

[1] 1  100

我尝试使用rbind
d<-rbind(d, d2)

并且 合并

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个数据框或将数据框附加到列表中吗?

1
你的数据框名称似乎不匹配。在代码中,第二个名称是 numobs,但在错误消息中,第二个名称似乎是 nobs。你能提供一个最小可重现的示例吗? - BenBarnes
d2 的结构是怎样的?它是一个长度为二的向量列表吗? - Sven Hohenstein
3个回答

6
我认为你混淆了和的用途。可以上下添加数据框或命名列表,或两者同时添加。而则是水平合并数据框。
你似乎还对向量和列表感到困惑。在R中,可以接受每个元素不同的数据类型,而必须有相同类型的所有元素。 和都是一维的。当您使用时,要附加一个<命名> ,而不是一个命名/未命名的。

未命名的向量和列表

您定义的方式是使用函数。您定义<未命名>列表的方式是使用函数,如下所示:
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

1
首先,例行检查器似乎正在寻找标记为“id”和“nobs”的列。如果与您的文件输出不匹配,您将收到该错误。
我正在上同一门课程,并遇到了相同的错误;更正我的列名称使其消失了(我将第二个标记为“nob”,而不是“nobs”!)现在,我已经成功地完成了例行检查器,或者看起来是这样...但它会输出三个数据文件,第一个和最后一个文件是正确的,但第二个文件会显示“对不起,那是不正确的。”没有进一步的反馈。令人发狂!
没有必要在这里发布我的代码,因为它在本地运行良好,并且当您不知道脚本在请求什么时,很难进行调试。叹气。

0

那个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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接