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

时间:2018-03-18 17:36:32

标签: r dataframe

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

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

我希望将最后10列移到前10列,因此他们会占据11到20的位置。

我的想法是使用Path2D来获取列的总数并使用一些基本的算术:

nrow

...获取索引值以重新排序。

然后像:

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

...相应地重新排序上面设置的索引值。

但我只是得到一个列索引的向量而没有保留行。

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

感谢。

3 个答案:

答案 0 :(得分:1)

这里最简单的解决方案是使用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"  

您也可以在基础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"  

答案 1 :(得分:1)

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

答案 2 :(得分:1)

这适用于基础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] 
#