하나의 변화를 어떻게 이 입력 (사용 계열: 시간 (내려졌단, 파일):
Time In Out Files
1 2 3 4
2 3 4 5
이 출력 (함께 e0100042.log: 시간, 출력, 입력, 파일)?
Time Out In Files
1 3 2 4
2 4 3 5
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
서브세트 함수를 사용할 수도 있습니다.
data <- subset(data, select=c(3,2,1))
하지만 또 다른 대답을 합니다 [] 로 더 유용할 수 연산자를 사용하여 알아야 할 수 있는 하나의 함장님이요 서브세트 reorder 작업 및 열
업데이트:
&Solarisdvd 드프리르 패키지 선택 함수를 사용할 수도 있습니다.
data = data %>% select(Time, out, In, Files)
I am not 확신하는 dplyr& # 39 의 구문을 효율성, 덕에 많은 경우, 특히 이 솔루션은 열을 보다 유연한 합니다. 예를 들어, 다음 는 보고서의 열을 순서재정리할 마스카르스 데이터세트를 반대 방향에서 순서:
mtcars %>% select(carb:mpg)
단, 일부 내용만 무시하시겠습니까 순서재정리할 다음 불지옥으 및 기타:
mtcars %>% select(mpg:disp, hp, wt, gear:qsec, starts_with('carb'))
자세한 내용은 dplyr& # 39 의 select 구문.
[이 주석문입니다] [1] 에서 언급했듯이 위한 제안 표준 순서 변경 '이' 다다드프라임 단 일반적으로 번거롭고, 특히 많은 경우 높은 열.
이 기능을 이용하면 열 수 있는 위치에 의해 다시 정렬: 지정하십시오라는 변수 이름 및 원하는 위치, don& # 39, 다른 열 걱정은 없다.
##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& # 39 의 요청에 다음과 같은 단순한 됩니다.
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
'시간' 과 '파일을 열 수 또한 스왑하는' 이 작업을 수행할 수 있습니다.
arrange.vars(table, c("Out"=2, "Files"=1, "Time"=4))
## Files Out In Time
##1 4 3 2 1
##2 5 4 3 2
[1]: https://stackoverflow.com/questions/5620885/how-does-one-reorder-columns-in-r # comment27255282_7496246
그리고 이를 통해 얻을 수 있는 좋은 방법을 사용할 수 있는지, 컴팩트형 데이타스터블 패키지
https://stackoverflow.com/questions/12232041/how-to-reorder-data-table-columns-without-copying
setcolorder(DT,myOrder)
이 경우 다테프라임 같은데
df <- data.frame(Time=c(1,2), In=c(2,3), Out=c(3,4), Files=c(4,5))
> df
Time In Out Files
1 1 2 3 4
2 2 3 4 5
> df2[,c(1,3,2,4)]
하지만 방금 작업을 않니다 는 열에 대한 의존도가 높아 오더할 너회의 입력입니다.
이 프로그래밍 스타일을 멸종될 피할 수 있다.
이 열의 가 더 나은 솔루션이 명시성 명명
data[,c("Time", "Out", "In", "Files")]
또한 계획인 경우에는 더 일반적인 설정을 사용자 코드에서 재사용합니다 됩니다
out.column.name <- "Out"
in.column.name <- "In"
data[,c("Time", out.column.name, in.column.name, "Files")]
때문에 수도 있는 아주 좋은 완전히 격리합니다 리터럴. 반면, 's' 를 사용하는 경우 dplyr& # 39.
data <- data %>% select(Time, out, In, Files)
그럼 나중에 읽어야 하는 자를 수; d # 39 you& 설정 코드 a 에 대해 조금 불과하니라 교도관님도요 코드) 로 나타나는 등 없이 리터럴을 열 이름을 사용하고 있다.
data.table::setcolorder(table, c("Out", "in", "files"))
나는 일을 잘 here 에서 유일하게 볼 수 있다.
shuffle_columns <- function (invec, movecommand) {
movecommand <- lapply(strsplit(strsplit(movecommand, ";")[[1]],
",|\\s+"), function(x) x[x != ""])
movelist <- lapply(movecommand, function(x) {
Where <- x[which(x %in% c("before", "after", "first",
"last")):length(x)]
ToMove <- setdiff(x, Where)
list(ToMove, Where)
})
myVec <- invec
for (i in seq_along(movelist)) {
temp <- setdiff(myVec, movelist[[i]][[1]])
A <- movelist[[i]][[2]][1]
if (A %in% c("before", "after")) {
ba <- movelist[[i]][[2]][2]
if (A == "before") {
after <- match(ba, temp) - 1
}
else if (A == "after") {
after <- match(ba, temp)
}
}
else if (A == "first") {
after <- 0
}
else if (A == "last") {
after <- length(myVec)
}
myVec <- append(temp, values = movelist[[i]][[1]], after = after)
}
myVec
}
이렇게 사용합니다.
new_df <- iris[shuffle_columns(names(iris), "Sepal.Width before Sepal.Length")]
마치 작동됨 매력.