[r] 데이터 프레임에서 열을 어떻게 재정렬합니까?

시간, 입력, 출력, 파일 순서대로이 입력을 어떻게 변경합니까?

Time   In    Out  Files
1      2     3    4
2      3     4    5

이 출력에 (시퀀스 : 시간, 출력, 파일)?

Time   Out   In  Files
1      3     2    4
2      4     3    5

더미 R 데이터는 다음과 같습니다.

table <- data.frame(Time=c(1,2), In=c(2,3), Out=c(3,4), Files=c(4,5))
table
##  Time In Out Files
##1    1  2   3     4
##2    2  3   4     5



답변

데이터 프레임에는 이와 같은 네 개의 열이 df[,c(1,2,3,4)]있습니다. 첫 번째 쉼표는 모든 행을 유지하고 1,2,3,4는 열을 나타냅니다.

위의 질문에서와 같이 순서를 변경하려면 df2[,c(1,3,2,4)]

이 파일을 csv로 출력하려면 write.csv(df2, file="somedf.csv")


답변

# reorder by column name
data <- data[c("A", "B", "C")]

#reorder by column index
data <- data[c(1,3,2)]


답변

서브셋 기능을 사용할 수도 있습니다.

data <- subset(data, select=c(3,2,1))

다른 답변에서와 같이 [] 연산자를 사용하는 것이 좋지만 단일 명령으로 하위 집합 및 열 재정렬 작업을 수행 할 수 있다는 것을 아는 것이 좋습니다.

최신 정보:

dplyr 패키지에서 select 기능을 사용할 수도 있습니다.

data = data %>% select(Time, out, In, Files)

효율성은 확실하지 않지만 dplyr의 구문 덕분에 특히 많은 열이있는 경우이 솔루션 이보다 유연해야합니다. 예를 들어, 다음은 mtcars 데이터 세트의 열을 반대 순서로 다시 정렬합니다.

mtcars %>% select(carb:mpg)

그리고 다음은 일부 열만 재정렬하고 다른 열은 다시 정렬합니다.

mtcars %>% select(mpg:disp, hp, wt, gear:qsec, starts_with('carb'))

dplyr의 select 구문 에 대해 자세히 알아보십시오 .


답변

이 의견 에서 언급했듯이 data.frame, 특히 열이 많은 경우 열의 순서를 다시 지정하기위한 표준 제안 은 번거롭고 오류가 발생하기 쉽습니다.

이 함수를 사용하면 위치별로 열을 다시 정렬 할 수 있습니다. 변수 이름과 원하는 위치를 지정하고 다른 열에 대해서는 걱정하지 마십시오.

##arrange df vars by position
##'vars' must be a named vector, e.g. c("var.name"=1)
arrange.vars <- function(data, vars){
    ##stop if not a data.frame (but should work for matrices as well)
    stopifnot(is.data.frame(data))

    ##sort out inputs
    data.nms <- names(data)
    var.nr <- length(data.nms)
    var.nms <- names(vars)
    var.pos <- vars
    ##sanity checks
    stopifnot( !any(duplicated(var.nms)), 
               !any(duplicated(var.pos)) )
    stopifnot( is.character(var.nms), 
               is.numeric(var.pos) )
    stopifnot( all(var.nms %in% data.nms) )
    stopifnot( all(var.pos > 0), 
               all(var.pos <= var.nr) )

    ##prepare output
    out.vec <- character(var.nr)
    out.vec[var.pos] <- var.nms
    out.vec[-var.pos] <- data.nms[ !(data.nms %in% var.nms) ]
    stopifnot( length(out.vec)==var.nr )

    ##re-arrange vars by position
    data <- data[ , out.vec]
    return(data)
}

이제 OP의 요청은 다음과 같이 간단 해집니다.

table <- data.frame(Time=c(1,2), In=c(2,3), Out=c(3,4), Files=c(4,5))
table
##  Time In Out Files
##1    1  2   3     4
##2    2  3   4     5

arrange.vars(table, c("Out"=2))
##  Time Out In Files
##1    1   3  2     4
##2    2   4  3     5

추가로 스왑 TimeFiles열을 수행 하려면 다음을 수행하십시오.

arrange.vars(table, c("Out"=2, "Files"=1, "Time"=4))
##  Files Out In Time
##1     4   3  2    1
##2     5   4  3    2


답변

dplyr용액 (일부의 tidyverse패키지 집합)를 사용하는 것이다 select:

select(table, "Time", "Out", "In", "Files") 

# or

select(table, Time, Out, In, Files)


답변

원하는 열 순서가 알파벳 순서로 내림차순으로 표시되는 것은 우연의 일치 일 수 있습니다. 그것이 바로 당신이 할 수있는 경우이기 때문에 :

df<-df[,order(colnames(df),decreasing=TRUE)]

열이 많은 큰 파일이있을 때 사용합니다.


답변

data.table 패키지를 사용할 수 있습니다 :

data.table 열을 재정렬하는 방법 (복사하지 않고)

require(data.table)
setcolorder(DT,myOrder)