7

列のないデータ フレームがあります。

df<-data.frame(v1=c(1:10), v2=seq(1, 100, length=10))

ヘッダー名を「X」と「Y」に変更したい

私はこれを使用してこれを行うことができることを知っています:

names(df)<-c("X","Y")

私がやりたいことは、データ フレームを引数として渡すことができる関数を記述し、これらのヘッダー名でヘッダーを配置することです。

私はもう試した:

get.names<- function(x)
    {names(x)<-c("X", "Y")}

助けてくれてありがとう。

4

3 に答える 3

8

関数は名前を設定します。オブジェクトを返すだけです。

get.names<- function(x) {
    names(x)<-c("X", "Y")
    x
}

setNamesまたは、関数を使用することもできます

> setNames(data.frame(v1=c(1:10), v2=seq(1, 100, length=10)), c("X","Y"))
    X   Y
1   1   1
2   2  12
3   3  23
4   4  34
5   5  45
6   6  56
7   7  67
8   8  78
9   9  89
10 10 100
于 2012-09-06T22:10:05.400 に答える
6

既にこれを行う R 関数がありますが、環境のデータ フレームを変更する代わりに、名前が変更されたデータ フレームを返します。

df<-`names<-`(df, new_names)

実際、あなたが呼び出すとき、あなたはすでにこの関数を迂回的に使用していますnames(df)<-...


渡された値を変更する R の関数はほとんどないことに注意してください。ほとんどすべての関数はスタイルが「機能的」であり、新しいコピーに変更を加えてそれを返します。このため、多くのコードを次の形式で表示および作成することを期待する必要がありますx=f(x)


役立つと思われるもう 1 つの手法は、パッケージrename内の関数です。reshape

df<-rename(df,c(v1="X", v2="Y"))

指定された列の名前を変更するだけです。リストやベクター内の名前の変更にも機能します!

于 2012-09-06T22:12:00.283 に答える
3

names<-とを使用して内部コピーを回避したい場合df<-rename(df,c(v1="X", v2="Y"))は、パッケージsetNamesを使用できますdata.table

# some example data
library(data.table)
DF <- data.frame(a = 1:5, b = 1:5)
DT <- data.table(DF)

data.tableを使用して、参照によって (コピーせずに)の名前を設定できます。setnames

setnames(DT, new = c('new_name1','newname2'))
DT
   new_name1 newname2
1:         1        1
2:         2        2
3:         3        3
4:         4        4
5:         5        5
# you can change only a subset by defining old and new
setnames(DT, old = 'new_name1', new = 'blah')
DT
        blah newname2
1:         1        1
2:         2        2
3:         3        3
4:         4        4
5:         5        5

data.tables を使用したくない場合は、パッケージのsetattr関数を使用できdata.tableます (パッケージ内の同じ名前の関数に非常に似ていbitます) 。

setattr(DF, 'names', c('oh','look'))
DF

  oh look
1  1    1
2  2    2
3  3    3
4  4    4
5  5    5

 bit::setattr(DF, 'names', c('yip','hee'))
DF
  yip hee
1   1   1
2   2   2
3   3   3
4   4   4
5   5   5
于 2012-10-31T02:47:22.433 に答える