【问题标题】:rename the columns name after cbind the data在 cbind 数据后重命名列名
【发布时间】:2012-06-21 20:18:44
【问题描述】:

merger <- cbind(as.character(Date),weather1$High,weather1$Low,weather1$Avg..High,weather1$Avg.Low,sale$Scanned.Movement[a])

cbind数据之后,新的DF自动有列名V1V2...... 我想通过

重命名列
colnames(merger)[,1] <- "Date"

但是失败了。而当我使用 merger$V1 时,

Error in merger$V1 : $ operator is invalid for atomic vectors

【问题讨论】:

    标签: r rename


    【解决方案1】:

    很简单,只需在添加之前将要使用的名称添加到引号中即可 向量

    a_matrix <- cbind(b_matrix,'Name-Change'= c_vector)
    

    【讨论】:

      【解决方案2】:

      产生data.frame 并能够在一行中执行此操作的一种方法是将传递给cbind 的所有矩阵/数据帧强制转换为data.frame,同时使用setNames 设置列名属性:

      a = matrix(rnorm(10), ncol = 2)
      b = matrix(runif(10), ncol = 2)
      
      cbind(setNames(data.frame(a), c('n1', 'n2')), 
            setNames(data.frame(b), c('u1', 'u2')))
      

      产生:

                n1        n2         u1        u2
      1 -0.2731750 0.5030773 0.01538194 0.3775269
      2  0.5177542 0.6550924 0.04871646 0.4683186
      3 -1.1419802 1.0896945 0.57212043 0.9317578
      4  0.6965895 1.6973815 0.36124709 0.2882133
      5  0.9062591 1.0625280 0.28034347 0.7517128
      

      不幸的是,对于在列名之后返回矩阵的数据帧,没有类似于setNamessetColNames 函数,但是,没有什么可以阻止您调整@ 的代码987654329@制作一个:

      setColNames <- function (object = nm, nm) {
          colnames(object) <- nm
          object
      }
      

      请参阅this answermagrittr 包包含此功能。

      【讨论】:

        【解决方案3】:

        您也可以直接在 cbind 调用中命名列,例如

        cbind(date=c(0,1), high=c(2,3))
        

        输出:

             date high
        [1,]    0    2
        [2,]    1    3
        

        【讨论】:

        • 我有同样的想法,但不知何故,在我的情况下只使用了第一个列名,随后的列名被忽略了......
        • 试试as.data.frame(cbind(date=c(0,1), high=c(2,3)))
        【解决方案4】:

        您在问题中给出了以下示例:

        colnames(merger)[,1]<-"Date"
        

        问题是逗号:colnames() 返回一个向量,而不是矩阵,所以解决方法是:

        colnames(merger)[1]<-"Date"
        

        【讨论】:

          【解决方案5】:

          试试:

          colnames(merger)[1] <- "Date"
          

          示例

          这是一个简单的例子:

          a <- 1:10
          b <- cbind(a, a, a)
          colnames(b)
          
          # change the first one
          colnames(b)[1] <- "abc"
          
          # change all colnames
          colnames(b) <- c("aa", "bb", "cc")
          

          【讨论】:

          • @jimsigner 我试过了,说:'dimnames' [2] 的长度不等于数组范围
          • 你能提供一个可重现的小例子吗?
          【解决方案6】:

          如果您提供cbind 一组参数,所有这些参数都是向量,您将得到的不是数据帧,而是一个矩阵,在这种情况下是一个全字符矩阵。他们有不同的特点。如果您的某些参数仍然是数据框,您可以获得数据框,请尝试:

          merger <- cbind(Date =as.character(Date),
                       weather1[ , c("High", "Low", "Avg..High", "Avg.Low")] , 
                       ScnMov =sale$Scanned.Movement[a] )
          

          【讨论】:

            【解决方案7】:

            如果您只将向量传递给cbind(),它会创建一个矩阵,而不是一个数据框。阅读?data.frame

            【讨论】:

              猜你喜欢
              • 2019-08-19
              • 2018-04-29
              • 1970-01-01
              • 1970-01-01
              • 2021-01-17
              • 2019-11-24
              • 1970-01-01
              • 2020-11-02
              • 2020-07-15
              相关资源
              最近更新 更多