데이터 프레임에서 열 순서를 변경하려면 어떻게 해야 합니까?
이 입력을 변경하는 방법(시간, 입력, 출력, 파일 순서):
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")] # leave the row index blank to keep all rows
#reorder by column index
data <- data[, c(1,3,2)] # leave the row index blank to keep all rows
부분 집합 함수를 사용할 수도 있습니다.
data <- subset(data, select=c(3,2,1))
다른 답변에서와 같이 [] 연산자를 사용하는 것이 좋으나 단일 명령에서 부분 집합 및 열 순서 변경 작업을 수행할 수 있다는 점을 알고 있으면 유용할 수 있습니다.
업데이트:
dplyr 패키지에서 선택 기능을 사용할 수도 있습니다.
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의 선택 구문에 대해 자세히 알아보십시오.
이 의견에서 언급된 것처럼, 열을 다시 정렬하기 위한 표준 제안은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
추가로 스왑하려면Time
그리고.Files
과 같은 열을 할 수 있습니다.
arrange.vars(table, c("Out"=2, "Files"=1, "Time"=4))
## Files Out In Time
##1 4 3 2 1
##2 5 4 3 2
솔루션(의 일부)tidyverse
패키지 세트)는 다음을 사용합니다.
select(table, "Time", "Out", "In", "Files")
# or
select(table, Time, Out, In, Files)
dplyr
전1.0.0
에는 를포니다가 포함됩니다.relocate()
열 변경할 수 : 다음과 같은 기능을 합니다.
dat <- data.frame(Time=c(1,2), In=c(2,3), Out=c(3,4), Files=c(4,5))
library(dplyr) # from version 1.0.0 only
dat %>%
relocate(Out, .before = In)
또는
dat %>%
relocate(Out, .after = Time)
원하는 열 순서가 알파벳 순으로 내림차순으로 열 이름을 갖는 것이 우연일 수 있습니다.그런 경우라면 다음과 같이 할 수 있습니다.
df<-df[,order(colnames(df),decreasing=TRUE)]
열이 많은 큰 파일이 있을 때 사용합니다.
data.table 패키지를 사용할 수 있습니다.
data.table 열 순서 변경 방법(복사하지 않음)
require(data.table)
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")]
그것은 또한 문학자들을 완전히 격리시키기 때문에 꽤 좋습니다.반대로 dplyr's를 사용하는 경우select
data <- data %>% select(Time, out, In, Files)
그러면 당신은 나중에 당신의 코드를 읽을 사람들을 함정에 빠뜨릴 것입니다.열 이름이 코드에 나타나지 않고 리터럴로 사용되고 있습니다.
data.table::setcolorder(table, c("Out", "in", "files"))
Dplyr에는 특정 열을 다른 열 앞이나 뒤로 이동할 수 있는 기능이 있습니다.빅데이터 프레임워크를 사용할 때 중요한 툴입니다(4열인 경우 앞에서 언급한 것처럼 select를 사용하는 것이 빠름).
https://dplyr.tidyverse.org/reference/relocate.html
당신의 경우는 다음과 같습니다.
df <- df %>% relocate(Out, .after = In)
심플하고 우아합니다.또한 여러 열을 함께 이동하고 처음 또는 끝으로 이동할 수 있습니다.
df <- df %>% relocate(any_of(c('ColX', 'ColY', 'ColZ')), .after = last_col())
다시 말씀드리지만, 빅 데이터 프레임으로 작업할 때 매우 강력합니다. :)
제가 일을 잘 본 유일한 사람은 여기서 온 것입니다.
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")]
매력적으로 작동합니다.
언급URL : https://stackoverflow.com/questions/5620885/how-does-one-reorder-columns-in-a-data-frame
'programing' 카테고리의 다른 글
UIViewContentModeScaleAspectFill이 클리핑되지 않음 (0) | 2023.06.16 |
---|---|
DataTable이 이미 다른 DataSet에 속합니다. (0) | 2023.06.16 |
Scala에서 Excel 파일을 읽는 방법 (0) | 2023.06.16 |
Oracle TNS: net 서비스 이름이 잘못 지정되었습니다. (0) | 2023.06.16 |
C Int 및 Long 32 - 64비트 단위의 값 범위 (0) | 2023.06.16 |