当data.frame获得新列时会发生什么情况?
看起来像是当data.frame获得新列时会发生什么情况?,r,matrix,dataframe,names,R,Matrix,Dataframe,Names,看起来像是数据。如果通过[函数将矩阵添加到帧中,则帧将继承矩阵的列名。例如: blob <- matrix(11:20, ncol = 1, dimnames = list(NULL, "BLOB")) foo <- data.frame(FOO = 201:210) dat <- data.frame(id = 1:10) dat[, "new1"] <- blob dat[, "new2"] <- foo 因此显示的不是预期的“new1”,而是“BLOB
数据。如果通过[
函数将矩阵添加到帧中,则帧
将继承矩阵的列名。例如:
blob <- matrix(11:20, ncol = 1, dimnames = list(NULL, "BLOB"))
foo <- data.frame(FOO = 201:210)
dat <- data.frame(id = 1:10)
dat[, "new1"] <- blob
dat[, "new2"] <- foo
因此显示的不是预期的“new1”
,而是“BLOB”
;即使colnames(dat)
是“id”
,“new1”
和“new2”
。此外“BLOB”
在属性(dat)
和dat[,“BLOB”
给出了“未定义的选定列”错误。
两个问题:
dat
会显示“BLOB”
,而不是“new1”
dat
,使其显示“new1”
,而不是“BLOB”
将整个矩阵分配给data.frame的列会创建一个非常奇怪的对象。如果您查看
dat
的结构,您将看到
'data.frame': 10 obs. of 3 variables:
$ id : int 1 2 3 4 5 6 7 8 9 10
$ new1: int [1:10, 1] 11 12 13 14 15 16 17 18 19 20
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr "BLOB"
$ new2: int 201 202 203 204 205 206 207 208 209 210
因此,您添加了一个仍然是矩阵的列。您可以看到embded矩阵保留了列名“BLOB”。将矩阵的一列分配给data.frame的列会更安全
dat[, "new1"] <- blob[,1]
这将保留“BLOB”列名,但现在它将是“普通”data.frame,因此“BLOB”将列在colnames()
当R打印带有嵌入矩阵的data.frame时,通常会在矩阵列名之前加上data.frame列名的前缀,但当只有一列时,它只使用矩阵列名(这可能会令人困惑)。注意:
mm<-matrix(1:9+10, nrow=3, dimnames=list(NULL, c("m1","m2","m3")))
data.frame(a=1:3, b = mm, c=letters[1:3])
# a b.m1 b.m2 b.m3 c
# 1 1 11 14 17 a
# 2 2 12 15 18 b
# 3 3 13 16 19 c
data.frame(a=1:3, b = mm[,1, drop=FALSE], c=letters[1:3])
# a m1 c
# 1 1 11 a
# 2 2 12 b
# 3 3 13 c
mm可能值得一提的是,将data.frame
如foo
分配给完整的列同样有风险。@MrFlick,感谢您迄今为止的回答。您能解释(或提供参考)什么是嵌入式矩阵(包括其用途)以及R如何处理这些矩阵吗?
do.call("cbind.data.frame", dat)
mm<-matrix(1:9+10, nrow=3, dimnames=list(NULL, c("m1","m2","m3")))
data.frame(a=1:3, b = mm, c=letters[1:3])
# a b.m1 b.m2 b.m3 c
# 1 1 11 14 17 a
# 2 2 12 15 18 b
# 3 3 13 16 19 c
data.frame(a=1:3, b = mm[,1, drop=FALSE], c=letters[1:3])
# a m1 c
# 1 1 11 a
# 2 2 12 b
# 3 3 13 c