【问题标题】:Add a new column between other dataframe columns [duplicate]在其他数据框列之间添加一个新列[重复]
【发布时间】:2013-04-04 03:05:56
【问题描述】:

我想在我的数据框中添加一个带有“NA”的新列:

     A       B
1    14379  32094
2   151884  174367
3   438422  449382

但我需要它位于上校之间。 A 和 B,像这样:

     A       C      B
1    14379   NA    32094
2   151884   NA    174367
3   438422   NA    449382

我知道如何添加 col.上校之后的 C。 B,但这对我没有帮助......有人知道怎么做吗?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    分两步,您可以对列重新排序:

    dat$C <- NA
    dat <- dat[, c("A", "C", "B")]
             A  C          B
    1  0.596068 NA -0.7783724
    2 -1.464656 NA -0.8425972
    

    你也可以使用append

    dat <- data.frame(A = rnorm(2), B = rnorm(2))
    as.data.frame(append(dat, list(C = NA), after = 1))
    
               A   C          B
    1 -0.7046408  NA  0.2117638
    2  0.8402680  NA -2.0109721
    

    【讨论】:

      【解决方案2】:

      如果您使用data.table您可以使用setcolorder。注意,NA存储为逻辑变量,如果要将列发起为整数,双或字符列,则可以使用NA_integerNA_real_NA_character_

      例如

      library(data.table)
      DT <- data.table(DF)
      # add column `C`  = NA 
      
      DT[, C := NA]
      
      setcolorder(DT, c('A','C','B'))
      DT
      ##         A  C      B
      ## 1:  14379 NA  32094
      ## 2: 151884 NA 174367
      ## 3: 438422 NA 449382
      

      你可以在一行中做到这一点

      setcolorder(DT[, C: = NA], c('A','B','C'))
      

      【讨论】:

        【解决方案3】:

        您也可以使用包 tibble,它有一个非常有趣的功能(以及许多其他功能):add_column()

        library(tibble)
        df <- data.frame("a" = 1:5, "b" = 6:10)
        add_column(df, c = rep(NA, nrow(df)), .after = 1)
        

        这个函数好用,可以用.before参数代替。

        【讨论】:

          【解决方案4】:

          我编写了一个函数来将列附加到(到)data.frame 上。它还允许您命名列,并进行一些检查...

          append_col <- function(x, cols, after=length(x)) {
              x <- as.data.frame(x)
              if (is.character(after)) {
                  ind <- which(colnames(x) == after)
                  if (any(is.null(ind))) stop(after, "not found in colnames(x)\n")
              } else if (is.numeric(after)) {
                  ind <- after
              }
              stopifnot(all(ind <= ncol(x)))
              cbind(x, cols)[, append(1:ncol(x), ncol(x) + 1:length(cols), after=ind)]
          }
          

          例子:

          # create data
          df <- data.frame("a"=1:5, "b"=6:10)
          
          # append column 
          append_col(df, list(c=1:5))
          
          # append after an column index
          append_col(df, list(c=1:5), after=1)
          
          # or after a named column
          append_col(df, list(c=1:5), after="a")
          
          # multiple columns / single values work as expected
          append_col(df, list(c=NA, d=4:8), after=1)
          

          (在函数末尾调用 cbind 并进行索引的一个优点是 data.frame 中的字符不会像使用 as.data.frame(append(x, cols, after=ind)) 那样被强制转换为因子)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-04-04
            • 1970-01-01
            • 1970-01-01
            • 2018-05-08
            • 1970-01-01
            • 2021-05-12
            • 1970-01-01
            • 2020-09-16
            相关资源
            最近更新 更多