代码之家  ›  专栏  ›  技术社区  ›  DeduciveR

当列数可以更改时,如何移动数据帧的最后x列

  •  0
  • DeduciveR  · 技术社区  · 8 年前

    这似乎是一个简单的问题,但我在这里找不到解决方案。

    我有一个900多列的数据框。精确的列数可以随着时间的推移而增加,但前10列始终相同,后10列始终相同。

    我想把最后10列移到前10列之后,因此它们将占据位置11到20。

    我的想法是 nrow 要获取总列数并使用一些基本算法,请执行以下操作:

    endcol <- df[,ncol(df)]
    endcol_start <- endcol-9
    midcol_end <- endcol_start-1
    

    。。。获取要重新排序的索引值。

    然后类似于:

    df2 <- df[,c(1:10, endcol_start:endcol, 11:midcol_end)]
    

    。。。根据上面设置的索引值重新排序。

    但我只得到了一个列索引向量,没有保留行。

    如何保留其中的行,以便数据帧实际重新排序?

    谢谢

    3 回复  |  直到 8 年前
        1
  •  1
  •   De Novo    8 年前

    这里最简单的解决方案是使用dplyr包:

    install.packages("dplyr")
    library(dplyr)
    n <- length(mtcars)
    mtcars2 <- select(mtcars, 1:3, (n-2):n, everything())
    

    通过查看名称,可以看到已将最后3列移动到前三列的正后方:

    names(mtcars)
    # [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"
    names(mtcars2)
    # [1] "mpg"  "cyl"  "disp" "am"   "gear" "carb" "hp"   "drat" "wt"   "qsec" "vs"  
    

    您也可以在base R中执行此操作,但它需要一个额外的计算(现在我想起来了,这很简单)。

    mtcars3 <- data.frame(mtcars[1:3], mtcars[(n-2):n], mtcars[4:(n-3)])
    names(mtcars3)
    # [1] "mpg"  "cyl"  "disp" "am"   "gear" "carb" "hp"   "drat" "wt"   "qsec" "vs"  
    
        2
  •  1
  •   caw5cv    8 年前
    df <- as.data.frame(matrix(0, ncol = 21, nrow = 5))
    
    
    df[,c(1:10, (length(df)-9):length(df), 11:(length(df)-10))]
    

    收益率

      V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V11
    1  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0
    2  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0
    3  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0
    4  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0
    5  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0
    
        3
  •  1
  •   eafpres    8 年前

    这适用于base R

    #
     test_frame <- as.data.frame(matrix(runif(100 * 100, 0, 100), 
                                         nrow = 100,
                                         ncol = 100))
    #
    # define the columns on left and right to bring together
    #  
     left_same_cols <- 10
     right_same_cols <- 10
    #  
    # populate data so we can visually verify result of move
    #  
     test_frame[, 1:10] <- 1
     test_frame[, 90:100] <- 2
    #
    # define new index sequence
    #
     cols <- c(1:left_same_cols, 
                (ncol(test_frame) - right_same_cols):ncol(test_frame), 
                (left_same_cols + right_same_cols):(ncol(test_frame) - 
     right_same_cols))
    #
    # create new data.frame with desired column order
    #  
     test_frame2 <- test_frame[, cols] 
    #