Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当data.frame获得新列时会发生什么情况?_R_Matrix_Dataframe_Names - Fatal编程技术网

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

当data.frame获得新列时会发生什么情况?,r,matrix,dataframe,names,R,Matrix,Dataframe,Names,看起来像是数据。如果通过[函数将矩阵添加到帧中,则帧将继承矩阵的列名。例如: 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 因此显示的不是预期的“new1”,而是“BLOB

看起来像是
数据。如果通过
[
函数将矩阵添加到帧中,则帧
将继承矩阵的列名。例如:

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
因此显示的不是预期的
“new1”
,而是
“BLOB”
;即使
colnames(dat)
“id”
“new1”
“new2”
。此外
“BLOB”
属性(dat)
dat[,“BLOB”
给出了“未定义的选定列”错误。 两个问题:

  • 为什么在这种情况下,
    dat
    会显示
    “BLOB”
    ,而不是
    “new1”
  • 如何更改
    dat
    ,使其显示
    “new1”
    ,而不是
    “BLOB”

  • 将整个矩阵分配给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
    
    因此,您添加了一个仍然是矩阵的列。您可以看到embded矩阵保留了列名“BLOB”。将矩阵的一列分配给data.frame的列会更安全

    dat[, "new1"] <- blob[,1] 
    
    这将保留“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
    

    mm可能值得一提的是,将
    data.frame
    foo
    分配给完整的列同样有风险。
    @MrFlick,感谢您迄今为止的回答。您能解释(或提供参考)什么是嵌入式矩阵(包括其用途)以及R如何处理这些矩阵吗?
    
    do.call("cbind.data.frame", dat)
    
    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