【问题标题】:What happens when a data.frame gets new columns?当 data.frame 获得新列时会发生什么?
【发布时间】:2016-11-29 17:25:22
【问题描述】:

如果[ 函数将矩阵添加到矩阵中,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"] 给出“未定义的列已选择”错误。 两个问题:

  1. 为什么在这种情况下dat 显示"BLOB" 而不是"new1"
  2. 如何更改dat,使其显示"new1" 而不是"BLOB"

【问题讨论】:

    标签: r matrix dataframe names


    【解决方案1】:

    将整个矩阵分配给 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 中。

    【讨论】:

    • 可能值得一提的是,将data.frame (如foo)分配给一整列同样有风险。 &lt;- foo[[1]]&lt;- foo[, 1] 会很好地防御。
    • @MrFlick,感谢您到目前为止的回答。您能否解释(或提供参考)什么是嵌入式矩阵(包括它们的用途)以及 R 如何处理这些?
    猜你喜欢
    • 2020-03-17
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多