web-dev-qa-db-ja.com

Rを使用してデータフレーム内の列を入れ替えることは可能ですか?

データフレームに3つの変数があり、4つの列を入れ替えたい

"dam"   "piglet"   "fdate"   "ssire"

"piglet"   "ssire"   "dam"   "tdate"

Rを使用してスワッピングを行う方法はありますか?

どんな助けでも大歓迎です。

バズ

24
baz
dfrm <- dfrm[c("piglet", "ssire", "dam", "tdate")]

または:

dfrm <- dfrm[ , c("piglet", "ssire", "dam", "tdate")]
37
42-
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
13
kohske

他の投稿を要約すると、列の順序を変更する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")))
9
Richie Cotton

サブセットの「select」引数を使用できます。

#Assume df contains "dam" "piglet" "fdate" "ssire"

newdf<-subset(df, select=c("piglet", "ssire", "dam", "tdate"))
6
PaulHurleyuk

これはほぼ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)
_

このアプローチには次の利点があります。

  1. select()では変数名を引用符で囲む必要がないため、lessと入力する必要があります。
  2. データフレームに4つ以上の変数がある場合、starts_with()ends_with()などの選択ヘルパー関数を使用して、各列に名前を付けて再配置する必要なく、複数の列を選択できます。とても簡単に。
2
Ashirwad

スワップしたいベクトル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)
}
0
Peter Dieter