3

の列名の名前を変更したいdata.frame

> x=data.frame(name=c("n1","n2"),sex=c("F","M"))
> colnames(x[1])="Name"
> x
  name sex
1   n1   F
2   n2   M
> colnames(x)[1]="Name"
> x
  Name sex
1   n1   F
2   n2   M
> 

なぜ機能しcolnames(x[1]) = "Name"ないのcolnames(x)[1]="Name"ですか?

理由は何ですか?それらの違いは何ですか?

4

2 に答える 2

5

情報が多すぎる答え:各オプションの「脱糖」を見ると、次のようになります。

# 1.
`[<-`(x, 1, value=`colnames<-`(x[1], 'Name'))
# 2.
`colnames<-`(x, `[<-`(colnames(x), 1, 'Name'))

最初のオプションは、最初の列から新しいdata.frameを作成し、その列の名前を(正常に)変更してから、そのdata.frameを最初の列に割り当て直そうとします。[<-.data.frame値を伝播しますが、の名前に基づいて既存の列の名前を変更しませんvalue

2番目のオプションは、data.frameのcolnamesを取得し、最初の値を更新し、更新された名前で新しいdata.frameを作成します。


(コメントでバックティッククォートを機能させる方法がわからないため、ここで@Peng Pengの質問に答えてください...)

バックティックは、変数名を引用することです。ここで違いを考慮してください:

x<-1
`x<-`<-1

1つ目はxという変数に1を割り当てますが、2つ目は。という変数に割り当てますx<-。これらの異常な変数名は、実際には<-プリミティブ関数によって使用されます。割り当てのlhsで任意の関数呼び出しが許可<-され、名前に追加された関数は、更新の実行方法を指定します(setflispと同様)。

于 2012-07-30T00:07:11.297 に答える
1

の列名属性を変更するためx、data.frame。したがって、

colnames(x) <- ....

1つ以上を同時に割り当てるかどうかに関係なく、正しいです。

于 2012-07-29T23:19:32.190 に答える