8.2 喀迈拉(no.41~no.44)
8.2.41 列明冲突
这是一个期望受挫的例子:
> one.col.mat <- cbind(matname=letters[1:3])
> one.col.mat
matname
[1,] "a"
[2,] "b"
[3,] "c"
> data.frame(x=one.col.mat)
matname
1 a
2 b
3 c
> data.frame(x=cbind(letters[1:3]))
x
1 a
2 b
3 c
当进行data.frame
调用时对每一个条目使用一个标签,期望在输出的相关列会是那个名字。然而,列的名字已经取得了优先权。
同样注意数据框包含一个因子列而不是字符列。
8.2.42 cbind
喜欢矩阵
如果你要cbind
两个矩阵,你会得到一个矩阵。如果你要cbind
两个数据框,你会得到一个数据框。如果你要cbind
两个向量,你会得到一个矩阵。
> is.matrix(cbind(x=1:10, y=rnorm(10)))
[1] TRUE
如果你要一个数据框,那就是用函数data.frame
:
> dfxy <- data.frame(x=1:10, y=rnorm(10))
8.2.43 数据框等价于行的数量
数据框是以列表的形式实现的。但有一点和列不同—每一个组件必须有相同的行。如果你够努力,你或许可以实现一个破坏此规则的数据框。更可能的结果是你的挫败感将来在于R将会阻止你获得如此荒谬的结果。
8.2.44 矩阵在数据框中
让我们创建两个数据框:
>ymat <- array(1:6, c(3,2))
>xdf6 <- data.frame(X=101:103, Y=ymat)
>xdf7 <- data.frame(X=101:103)
>xdf7$Y <- ymat
>xdf6
X Y.1 Y.2
1 101 1 4
2 102 2 5
3 103 3 6
> xdf7
X Y.1 Y.2
1 101 1 4
2 102 2 5
3 103 3 6
> dim(xdf6)
[1] 3 3
> dim(xdf7)
[1] 3 2
输出是完全一样的。但是很清楚,它们有不同的维度。
> xdf6[, ’Y.1’]
[1] 1 2 3
> xdf7[, ’Y.1’]
Error in "[.data.frame"(xdf7, , "Y.1") :
undefined columns selected
> xdf6[, ’Y’]
Error in "[.data.frame"(xdf6, , "Y") :
undefined columns selected
> xdf7[, ’Y’]
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
xdf6
包含Y.1
和Y.2
组件。xdf7
并不包含这样的组件(除了它使怎样输出的)—它有一个含有两个列的矩阵组件Y
你将会确定地知道允许一个数据框还有多于一列的组件是令人厌恶的。除非你是这样想的,当然,你将会有机会看到它是非常有用的。这个特点值得你去迷惑,但是改变输出将会减少迷惑。