我有一个整数的文本文件,我一直在读R并暂时存储为数据帧.但是,将它强制转换为矩阵(比如说y
,使用as.matrix()
)似乎与我创建的矩阵(x
)没有相同.也就是说,如果我查看单个条目,我会得到不同的输出
> y[1,1] V1 0
而不是
> x[1,1] [1] 0
有人可以解释这个区别吗?
我将你的问题解释为询问矩阵和数据帧之间的区别,而不仅仅是为什么输出y[1,1]
看起来不同,如果y
是数据帧与矩阵.如果您只想知道它们看起来与众不同的原因那么答案就是数据框架和矩阵是不同的类并且具有不同的内部表示,尽管已经设计并实现了许多操作,以便在结束矩阵索引和数据框架方面存在差异.索引是单独实现的,并不一定必须相同,尽管希望它们合理地一致地实现.在这一点上,修改R以减少任何不一致性可能是不明智的,因为它可能会破坏多少代码.
矩阵矩阵是具有维度的向量.
m1 <- 1:12 dim(m1) <- c(4, 3) m2 <- matrix(1:12, 4, 3) identical(m1, m2) ## [1] TRUE length(m1) # 12 elements in the underlying vector ## [1] 12
数据框
data.frame是具有行名称的列的命名列表(名称是列名称) - 默认行名称1,2,...在内部表示为c(NA, -4L)
4行数据帧,以避免出现存储可能大的行名称向量.
DF1 <- as.data.frame(m1) DF2 <- list(V1 = 1:4, V2 = 5:8, V3 = 9:12) attr(DF2, "row.names") <- c(NA, -4L) class(DF2) <- "data.frame" identical(DF1, DF2) ## [1] TRUE length(DF1) # 3 columns ## [1] 3
名
矩阵不必具有行名或列名,而数据框总是如此.如果矩阵具有行名和列名,则它们被表示为两个称为dimnames的向量的列表(与具有row.names属性的命名列表相对,该属性是数据帧表示其行名的方式).
m3 <- m1 rownames(m3) <- c("a", "b", "c", "d") colnames(m3) <- c("A", "B", "C") str(m3) ## int [1:4, 1:3] 1 2 3 4 5 6 7 8 9 10 ... ## - attr(*, "dimnames")=List of 2 ## ..$ : chr [1:4] "a" "b" "c" "d" ## ..$ : chr [1:3] "A" "B" "C" m4 <- m1 dimnames(m4) <- list(c("a", "b", "c", "d"), c("A", "B", "C")) identical(m3, m4) ## [1] TRUE
lapply
假设我们对矩阵m1进行了讨论.由于它实际上是一个具有维度的向量,因此我们对12个元素中的每个元素进行了应用:
> str(lapply(m1, length)) List of 12 $ : int 1 $ : int 1 $ : int 1 $ : int 1 $ : int 1 $ : int 1 $ : int 1 $ : int 1 $ : int 1 $ : int 1 $ : int 1 $ : int 1
而如果我们这样做,DF1
我们将使用3个元素,每个元素的长度为4
> str(lapply(DF1, length)) List of 3 $ V1: int 4 $ V2: int 4 $ V3: int 4
双索引 索引是指如果矩阵没有名称,DF1 [1,1]和m1 [1,1]给出相同的结果.
DF1[1,1] ## [1] 1 m1[1,1] ## [1] 1
如果它确实存在观察到的差异:
as.matrix(DF1)[1,1] # as.matrix(DF1) has col names V1, V2, V3 from DF1 V1 1 DF1[1,1] [1] 1
在将矩阵转换为数据帧时必须要小心,因为如果数据框中有字符和数字列,则转换将强制它们全部为相同类型,即全部为字符.
单索引
但是,如果我们像这样索引,那么由于数据帧是列的列表,我们得到由第一列组成的数据帧
> DF1[1] V1 1 1 2 2 3 3 4 4
但对于矩阵,因为它是具有维度的向量,我们得到该向量的第一个元素
> m1[1] [1] 1
其他
在通常情况下,矩阵的所有元素都是数字,或者都是字符,但对于数据框,每列可能不同.一列可能是数字,而另一列可能是字符或逻辑.
通常,对矩阵的操作比对数据帧的操作更快.