R-当data.frame获取新列时会发生什么



如果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。两个问题:

  1. 为什么dat在这种情况下显示"BLOB"而不是"new1"
  2. 如何以显示"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中。

最新更新