2

データ フレーム内の変数の大部分の名前を変更していますが、自分の方法にはあまり感銘を受けません。

したがって、SOの誰かが、ベースのみを使用して以下に示す方法よりもスマートまたは高速な方法を持っていますか?

    data(mtcars)
  # head(mtcars)


  temp.mtcars <- mtcars
  names(temp.mtcars) <- c((x <- c("mpg", "cyl", "disp")), 
                           gsub('^', "baR.", setdiff(names (mtcars),x)))
  str(temp.mtcars)
  'data.frame': 32 obs. of  11 variables:
   $ mpg     : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
   $ cyl     : num  6 6 4 6 8 6 8 4 4 6 ...
   $ disp    : num  160 160 108 258 360 ...
   $ baR.hp  : num  110 110 93 110 175 105 245 62 95 123 ...
   $ baR.drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
   $ baR.wt  : num  2.62 2.88 2.32 3.21 3.44 ...
   $ baR.qsec: num  16.5 17 18.6 19.4 17 ...
   $ baR.vs  : num  0 0 1 1 0 1 0 1 1 1 ...
   $ baR.am  : num  1 1 1 0 0 0 0 0 0 0 ...
   $ baR.gear: num  4 4 4 3 3 3 3 4 4 4 ...
   $ baR.carb: num  4 4 1 1 2 1 4 2 2 4 ...
4

5 に答える 5

7

ベースRのみを使用して回答用に編集

パッケージplyrには、あなたが求めることを行う便利な機能rename()があります。変更された質問では、ベース R のみを使用することを指定しています。これを行う簡単な方法の 1 つは、コードをコピーしplyr::renameて独自の関数を作成することです。

rename <- function (x, replace) {
  old_names <- names(x)
  new_names <- unname(replace)[match(old_names, names(replace))]
  setNames(x, ifelse(is.na(new_names), old_names, new_names))
}

この関数renameは、ベクトルの要素が新しい名前で、ベクトルの名前が既存の名前である、名前付きベクトルである引数を取ります。このような名前付きベクターを作成するには、さまざまな方法があります。以下の例では、単純にstructure.

x <- c("mpg", "disp", "wt")
some.names <- structure(paste0("baR.", x), names=x)
some.names
       mpg       disp         wt 
 "baR.mpg" "baR.disp"   "baR.wt" 

これで名前を変更する準備が整いました:

mtcars  <- rename(mtcars, replace=some.names)

結果:

'data.frame':   32 obs. of  11 variables:
 $ baR.mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl     : num  6 6 4 6 8 6 8 4 4 6 ...
 $ baR.disp: num  160 160 108 258 360 ...
 $ hp      : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat    : num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ baR.wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec    : num  16.5 17 18.6 19.4 17 ...
 $ vs      : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am      : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear    : num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb    : num  4 4 1 1 2 1 4 2 2 4 ...
于 2012-05-19T06:39:48.783 に答える
3

私は使用しますifelse

names(temp.mtcars) <- ifelse(names(mtcars) %in% c("mpg", "cyl", "disp"),
                             names(mtcars),
                             paste("bar", names(mtcars), sep = "."))
于 2012-05-19T23:57:46.470 に答える
2

ほぼ同じですが、なしplyr:

data(mtcars)

temp.mtcars <- mtcars

carNames <- names(temp.mtcars)
modifyNames <- !(carNames %in% c("mpg", "cyl", "disp"))

names(temp.mtcars)[modifyNames] <- paste("baR.", carNames[modifyNames], sep="")

出力:

str(temp.mtcars)
'data.frame':   32 obs. of  11 variables:
$ mpg     : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl     : num  6 6 4 6 8 6 8 4 4 6 ...
$ disp    : num  160 160 108 258 360 ...
$ baR.hp  : num  110 110 93 110 175 105 245 62 95 123 ...
$ baR.drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ baR.wt  : num  2.62 2.88 2.32 3.21 3.44 ...
$ baR.qsec: num  16.5 17 18.6 19.4 17 ...
$ baR.vs  : num  0 0 1 1 0 1 0 1 1 1 ...
$ baR.am  : num  1 1 1 0 0 0 0 0 0 0 ...
$ baR.gear: num  4 4 4 3 3 3 3 4 4 4 ...
$ baR.carb: num  4 4 1 1 2 1 4 2 2 4 ...
于 2012-05-19T10:25:47.983 に答える
1

パッケージrename.vars内の関数を使用できます。gdata変数名のサブセットのみを置き換えたい場合や、名前のベクトルの順序が data.frame 内の名前の順序と同じでない場合にうまく機能します。

ヘルプファイルから適応:

library(gdata)
data <- data.frame(x=1:10,y=1:10,z=1:10)
names(data)
data <- rename.vars(data, from=c("z","y"), to=c("Z","Y"))
names(data)

data.frame 名を変換します。

[1] "x" "y" "z"

[1] "x" "Y" "Z"

つまり、これがサブセット化を処理する方法と、名前の文字列が data.frame 内の名前と同じ順序ではないことに注意してください。

于 2015-03-05T04:34:02.627 に答える
0
names(df)[match(
                c('old_var1','old_var2'),
                names(df)
               )]=c('new_var1', 'new_var2')
于 2015-12-11T02:29:07.833 に答える