这似乎是一个简单的问题,但我无法在这里找到解决方案。
我的数据框超过900列。精确的列数可以随着时间的推移而增加,但前10个始终相同,后10个始终相同。
我希望将最后10列移到前10列,因此他们会占据11到20的位置。
我的想法是使用Path2D
来获取列的总数并使用一些基本的算术:
nrow
...获取索引值以重新排序。
然后像:
endcol <- df[,ncol(df)]
endcol_start <- endcol-9
midcol_end <- endcol_start-1
...相应地重新排序上面设置的索引值。
但我只是得到一个列索引的向量而没有保留行。
如何保留此行中的行,以便实际重新排序数据框?
感谢。
答案 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]
#