我认为您混淆了rbind
and的目的merge
。rbind
附加 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