どのようにしてこの入力を変更しますか(シーケンスはtime、in、out、files)。
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)]
のような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
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
たぶんそれはあなたが望む列の順序が降順のアルファベット順に列名を持っているという偶然の一致です。そういうわけであなたはただすることができました:
df<-df[,order(colnames(df),decreasing=TRUE)]
それは私がたくさんのカラムを持つ大きなファイルを持っているときに使うものです。
あなたがdata.tableパッケージを使用することができれば、これは良いコンパクトな方法を提供します。
setcolorder(DT,myOrder)
tidyverse
解決策はselect
を使うことです:
select(table, "Time", "Out", "In", "Files")
# or
select(table, Time, Out, In, Files)
あなたのデータフレームがこのように見えるなら
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のselect
を使うならば
data <- data %>% select(Time, out, In, Files)
それからあなたは自分のコードも含め、後であなたのコードを読む人をちょっとした欺瞞のためにセットアップすることになるでしょう。列名は、コードには表示されずにリテラルとして使用されています。
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")]
魅力のように働きます。