データフレームに3つの変数があり、4つの列を入れ替えたい
"dam" "piglet" "fdate" "ssire"
に
"piglet" "ssire" "dam" "tdate"
Rを使用してスワッピングを行う方法はありますか?
どんな助けでも大歓迎です。
バズ
dfrm <- dfrm[c("piglet", "ssire", "dam", "tdate")]
または:
dfrm <- dfrm[ , c("piglet", "ssire", "dam", "tdate")]
d <- data.frame(a=1:3, b=11:13, c=21:23)
d
# a b c
#1 1 11 21
#2 2 12 22
#3 3 13 23
d2 <- d[,c("b", "c", "a")]
d2
# b c a
#1 11 21 1
#2 12 22 2
#3 13 23 3
または、インデックスを使用して同じことを行うことができます:
d3 <- d[,c(2, 3, 1)]
d3
# b c a
#1 11 21 1
#2 12 22 2
#3 13 23 3
他の投稿を要約すると、列の順序を変更する3つの方法と、各メソッドでインデックスを指定する2つの方法があります。
サンプルデータフレームを考える
dfr <- data.frame(
dam = 1:5,
piglet = runif(5),
fdate = letters[1:5],
ssire = rnorm(5)
)
Kohskeの答え:列番号を使用して、標準の行列のようなインデックスを使用できます
dfr[, c(2, 4, 1, 3)]
または列名を使用する
dfr[, c("piglet", "ssire", "dam", "fdate")]
DWin&Gavinの答え:データフレームでは、インデックスを指定するときに行引数を省略できます。
dfr[c(2, 4, 1, 3)]
dfr[c("piglet", "ssire", "dam", "fdate")]
PaulHurleyukの回答:subset
も使用できます。
subset(dfr, select = c(2, 4, 1, 3))
subset(dfr, select = c(c("piglet", "ssire", "dam", "fdate")))
サブセットの「select」引数を使用できます。
#Assume df contains "dam" "piglet" "fdate" "ssire"
newdf<-subset(df, select=c("piglet", "ssire", "dam", "tdate"))
これはほぼ8年前の質問であることに気づきました。しかし、Rを学習し始めて、この質問に出くわす可能性がある人のために、私がしたように、次のようにdplyr
パッケージの非常に柔軟なselect()
関数を使用してスワッピング操作を実行できます。 。
_# Install and load the dplyr package
install.packages("dplyr")
library("dplyr")
# Override the existing data frame with the desired column order
df <- select(df, piglet, ssire, dam, tdate)
_
このアプローチには次の利点があります。
select()
では変数名を引用符で囲む必要がないため、lessと入力する必要があります。starts_with()
、ends_with()
などの選択ヘルパー関数を使用して、各列に名前を付けて再配置する必要なく、複数の列を選択できます。とても簡単に。スワップしたいベクトルvと列インデックスaとbをとる関数をすぐに書きました。
swappy = function(v,a,b){ # where v is a dataframe, a and b are the columns indexes to swap
name = deparse(substitute(v))
helpy = v[,a]
v[,a] = v[,b]
v[,b] = helpy
name1 = colnames(v)[a]
name2 = colnames(v)[b]
colnames(v)[a] = name2
colnames(v)[b] = name1
assign(name,value = v , envir =.GlobalEnv)
}