【问题标题】:Move a column to first position in a data frame将列移动到数据框中的第一个位置
【发布时间】:2014-04-12 17:52:25
【问题描述】:

我想将数据框的最后一列移到开头(作为第一列)。我如何在 R 中做到这一点?

我的 data.frame 有大约一千列可以更改顺序。我只想选择一列并“将其移至开头”。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    Dplyr 的 select() 方法

    将最后一列移到开头:

    new_df <- df %>%
      select(last_column_name, everything())
    

    这也适用于任何列和任何数量:

    new_df <- df %>%
      select(col_5, col_8, everything())
    

    使用mtcars数据框的示例:

    head(mtcars, n = 2)
    #                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
    # Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    # Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    
    # Last column is 'carb'
    new_df <- mtcars %>% select(carb, everything())
    
    head(new_df, n = 2)
    #                   carb  mpg cyl disp  hp drat    wt  qsec vs am gear
    # Mazda RX4            4 21.0   6  160 110 3.90 2.620 16.46  0  1    4
    # Mazda RX4 Wag        4 21.0   6  160 110 3.90 2.875 17.02  0  1    4
    

    【讨论】:

      【解决方案2】:

      您可以通过使用data[,c(ORDER YOU WANT THEM TO BE IN)] 明确选择它们来以新顺序对它们进行寻址来更改它们的顺序

      如果您只想首先使用最后一列:data[,c(ncol(data),1:(ncol(data)-1))]

      > head(cars)
        speed dist
      1     4    2
      2     4   10
      3     7    4
      4     7   22
      5     8   16
      6     9   10
      
      > head(cars[,c(2,1)])
        dist speed
      1    2     4
      2   10     4
      3    4     7
      4   22     7
      5   16     8
      6   10     9
      

      【讨论】:

      • 谢谢,这会破坏整个数据帧(我的 DF 有 1000 列)
      • 那么就用data[,c(ncol(data),1:(ncol(data)-1))]
      • 正是我想要的。我不得不在其他 33 列的开头移动最后 8 列,并且我使用了。 expr
      【解决方案3】:
      dataframe<-dataframe[,c(1000, 1:999)]
      

      这会将您的最后一列(即第 1000 列)移动到第一列。

      【讨论】:

        【解决方案4】:

        dplyr 1.0.0 现在包含 relocate() 函数来重新排序列。默认行为是将命名列移动到第一个位置。

        library(dplyr) # from version 1.0.0 
        
        mtcars %>%
          relocate(carb) %>%
          head()
        
                          carb  mpg cyl disp  hp drat    wt  qsec vs am gear
        Mazda RX4            4 21.0   6  160 110 3.90 2.620 16.46  0  1    4
        Mazda RX4 Wag        4 21.0   6  160 110 3.90 2.875 17.02  0  1    4
        Datsun 710           1 22.8   4  108  93 3.85 2.320 18.61  1  1    4
        Hornet 4 Drive       1 21.4   6  258 110 3.08 3.215 19.44  1  0    3
        Hornet Sportabout    2 18.7   8  360 175 3.15 3.440 17.02  0  0    3
        Valiant              1 18.1   6  225 105 2.76 3.460 20.22  1  0    3
        

        但可以使用.before.after 参数指定其他位置:

        mtcars %>%
          relocate(gear, carb, .before = cyl) %>%
          head()
        
                           mpg gear carb cyl disp  hp drat    wt  qsec vs am
        Mazda RX4         21.0    4    4   6  160 110 3.90 2.620 16.46  0  1
        Mazda RX4 Wag     21.0    4    4   6  160 110 3.90 2.875 17.02  0  1
        Datsun 710        22.8    4    1   4  108  93 3.85 2.320 18.61  1  1
        Hornet 4 Drive    21.4    3    1   6  258 110 3.08 3.215 19.44  1  0
        Hornet Sportabout 18.7    3    2   8  360 175 3.15 3.440 17.02  0  0
        Valiant           18.1    3    1   6  225 105 2.76 3.460 20.22  1  0
        

        【讨论】:

          【解决方案5】:

          我不知道是否值得将其添加为答案或评论是否可以,但我编写了一个名为 moveme 的函数,可让您使用您描述的语言做您想做的事情。您可以在此答案中找到该功能:https://stackoverflow.com/a/18540144/1270695

          它适用于您的data.framenames,并生成一个字符向量,您可以使用该向量对列重新排序:

          mydf <- data.frame(matrix(1:12, ncol = 4))
          mydf
          moveme(names(mydf), "X4 first")
          # [1] "X4" "X1" "X2" "X3"
          moveme(names(mydf), "X4 first; X1 last")
          # [1] "X4" "X2" "X3" "X1"
          
          mydf[moveme(names(mydf), "X4 first")]
          #   X4 X1 X2 X3
          # 1 10  1  4  7
          # 2 11  2  5  8
          # 3 12  3  6  9
          

          如果您像这样改组,我建议将您的data.frame 转换为data.table 并使用setcolorder(如果您愿意,可以使用我的moveme 函数)通过​​引用进行更改。


          在您的问题中,您还提到“我只想选择一列并将其移至开头”。如果它是任意列,而不是最后一列,您还可以使用setdiff 查看。

          假设您正在使用“mtcars”数据集并希望将“am”列移到开头。

          x <- "am"
          mtcars[c(x, setdiff(names(mtcars), x))]
          

          【讨论】:

            【解决方案6】:

            如果要将任何命名列移动到第一个位置,只需使用:

            df[,c(which(colnames(df)=="desired_colname"),which(colnames(df)!="desired_colname"))]
            

            【讨论】:

            • 这很容易成为最佳答案
            • 当命名列是有序因子时,这似乎不起作用。
            • 这对我很有用。使用 data.table 它不能直接使用,但可以使用 neworder &lt;- c(which(colnames(df)=="id"),which(colnames(df)!="id")) 然后 setcolorder(df, neworder)
            【解决方案7】:

            使用任意数量的行或列将数据框的最后一列移动到第一列位置的原生 R 方法:

            df <- df[,c(ncol(df),1:ncol(df)-1)]
            

            它可用于将任何列移动到第一列,通过替换:

            df <- df[,c(your_column_number_here,1:ncol(df)-1)]
            

            如果您不知道列号,但知道列标签名称,请执行以下替换“your_column_name_here”:

            columnNumber <- which(colnames(df)=="your_column_name_here")
            df <- df[,c(columnNumber,1:ncol(df)-1)]
            

            【讨论】:

            • 对于任何列方案,我需要将1:ncol(df)-1) 更改为which(colnames(df) != "your_column_name_here") 以获取剩余的列,而不是总是删除最后一列,如下面的@HT_079 建议的那样。
            【解决方案8】:

            还有data.table 选项与setcolorder()

            library(data.table)
            mtcars_copy <- copy(mtcars)
            setDT(mtcars_copy)
            
            # Move column "gear" in the first position
            setcolorder(mtcars_copy, neworder = "gear")
            
            head(mtcars_copy)
            
            #    gear  mpg cyl disp  hp drat    wt  qsec vs am carb
            # 1:    4 21.0   6  160 110 3.90 2.620 16.46  0  1    4
            # 2:    4 21.0   6  160 110 3.90 2.875 17.02  0  1    4
            # 3:    4 22.8   4  108  93 3.85 2.320 18.61  1  1    1
            # 4:    3 21.4   6  258 110 3.08 3.215 19.44  1  0    1
            # 5:    3 18.7   8  360 175 3.15 3.440 17.02  0  0    2
            # 6:    3 18.1   6  225 105 2.76 3.460 20.22  1  0    1
            

            如果有多个列,则在向量中提及顺序:

            setcolorder(mtcars_copy, neworder = c("vs", "carb"))
            
            head(mtcars_copy)
            #    vs carb gear  mpg cyl disp  hp drat    wt  qsec am
            # 1:  0    4    4 21.0   6  160 110 3.90 2.620 16.46  1
            # 2:  0    4    4 21.0   6  160 110 3.90 2.875 17.02  1
            # 3:  1    1    4 22.8   4  108  93 3.85 2.320 18.61  1
            # 4:  1    1    3 21.4   6  258 110 3.08 3.215 19.44  0
            # 5:  0    2    3 18.7   8  360 175 3.15 3.440 17.02  0
            # 6:  1    1    3 18.1   6  225 105 2.76 3.460 20.22  0
            

            【讨论】:

              【解决方案9】:

              将任何列从任何位置移动到数据中的第一个位置

              n <- which(colnames(df)=="column_need_move")
              column_need_move <- df$column_need_to_move
              df <- cbind(column_need_move, df[,-n])
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2022-11-29
                • 2018-10-15
                • 1970-01-01
                • 1970-01-01
                • 2022-01-08
                • 2011-12-08
                • 2018-07-17
                • 2020-01-30
                相关资源
                最近更新 更多