如果data.frames
函数将矩阵添加到矩阵中,[
似乎继承了矩阵的列号。例如:
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
如果我现在查看dat
,它会显示我
id BLOB new2
1 11 201
2 12 202
3 13 203
...
所以不会显示预期的"new1"
,而是"BLOB"
;即使colnames(dat)
为"id"
,"new1"
和"new2"
。此外,在"BLOB"
中找不到attributes(dat)
,dat[, "BLOB"]
会在&#34;未定义的列中选择&#34; -error。
两个问题:
dat
在这种情况下显示"BLOB"
而不显示"new1"
?dat
而不是"new1"
的方式更改"BLOB"
?答案 0 :(得分:2)
将整个矩阵分配给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
所以你添加了一个仍然是矩阵的列。您可以看到嵌入矩阵保留了列名“BLOB”。仅使用
将矩阵列分配给data.frame的列会更安全dat[, "new1"] <- blob[,1]
blob
可能包含多个列的原因。如果你只将它分配给“new1”那么其他列应该去哪里?因此它将整个矩阵嵌入到列中。
您可以使用
扩展嵌入矩阵do.call("cbind.data.frame", dat)
这将保留“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
长话短说:不要在data.frame中放置矩阵。