当data.frame获得新列时会发生什么?

时间:2016-11-29 17:25:23

标签: r matrix dataframe names

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

  1. 为什么dat在这种情况下显示"BLOB"而不显示"new1"
  2. 如何以dat而不是"new1"的方式更改"BLOB"

1 个答案:

答案 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中放置矩阵。