如果data.frames
通过[
函数添加了矩阵,则CC_1似乎继承了矩阵的colnames。示例:
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"]
给出了"未定义的列选择" -Error。两个问题:
- 为什么
dat
在这种情况下显示"BLOB"
而不是"new1"
? - 如何以显示
"new1"
而不是"BLOB"
的方式更改dat
?
将整个矩阵分配给数据列。帧创建一个非常奇怪的对象。如果您查看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"。只需将矩阵的列分配给数据列。
dat[, "new1"] <- blob[,1]
blob
可能具有多个列的原因。如果仅将其分配给" new1",那这些其他列应该在哪里?因此,它将整个矩阵嵌入列中。
您可以使用
扩展嵌入式矩阵do.call("cbind.data.frame", dat)
将保留" blob"列名,但现在将是"正常"数据。
当r打印data.frame带有嵌入矩阵时,通常会在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中。