5

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

4

3 回答 3

4

我认为您混淆了rbindand的目的mergerbind附加 data.frames 或命名列表,或两者都垂直。虽然水平merge组合 data.frames 。

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

未命名的向量和列表

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

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

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

请注意,两者vec1都有list1两个元素,但是将这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's 实际上list是每列的一个元素list,因为df$column通常用于从数据框中提取列。这是有道理的,因为list' 和data.frame' 都可以采用不同的数据类型,不像vectors'。

rbind功能_

当您的第一个元素是数据框时,rbind要求您附加的内容与数据框的列具有相同的名称。现在,命名vector将不起作用,因为 a 的元素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
于 2017-09-05T14:00:10.710 回答
1

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

我正在上可能是同一类的课程并且有同样的错误;更正我的列名使它消失了(我将第二个标记为“nob”而不是“nobs”!)现在我已经让例行检查器正确完成,或者看起来......但它输出了三个数据文件,第一个和最后一个文件是正确的,但第二个文件产生“对不起,这是不正确的”。没有进一步的反馈。令人抓狂!

在这里发布我的代码毫无意义,因为它在所有课程示例中都可以在本地正常运行,而且当您不知道脚本要求什么时,调试起来有点困难。叹。

于 2013-01-15T19:17:22.677 回答
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
于 2012-10-05T07:25:01.807 回答