2017-02-28 7 views
1

いくつかのデータフレームで再生すると奇妙な現象が発生しました。rownamesを同じものに変更すると、同じデータフレームが異なるのはなぜですか?

は、ここでおもちゃの例です:私は2つの同一のデータフレームを作成すると

rm(list=ls()) 

a <- data.frame(a=c(1,2,3),b=c(2,3,4)) 
b <- a 
identical(a,b) 
#TRUE 

identical(rownames(a),rownames(b)) 
#TRUE 

rownames(b) <- rownames(a) 

identical(a,b) 
#FALSE 

、そして周りの彼らのrownamesを交換し、彼らは同じよう出てきません。

誰でも再現/説明できますか?

+1

ルックス)'文字ベクトルを返すので、行名は、異なる種類の属性として終わります。 – joran

+1

'c(NA、-3L)'は 'c(" 1 "、" 2 "、" 3 ")に変更された最初のケ​​ースです。 – akrun

答えて

4

これは明らかに少し混乱しています。 row.namesがNULLとして供給されたか、何の適切なコンポーネントが見つからなかった場合 行名は、整数1から始まる配列(およびそのような行である 名が「自動であると考えられる

?data.frame始まる我々は見ます'、および as.matrixによって保存されていません)。

だから、最初はabそれぞれが整数であるrow.namesを属性と呼ばれています:

> str(attributes(a)) 
List of 3 
$ names : chr [1:2] "a" "b" 
$ row.names: int [1:3] 1 2 3 
$ class : chr "data.frame" 

しかしdimnames()がするようにフードの下と呼ばれる文字ベクトルの実際のリストは、(文字ベクトルをrownames()返します)。ですから、で終わる行名を再割り当てした後:行名は、最初は数値ですが、 `rownames(のような

> str(attributes(b)) 
List of 3 
$ names : chr [1:2] "a" "b" 
$ row.names: chr [1:3] "1" "2" "3" 
$ class : chr "data.frame" 
関連する問題