2016-11-29 3 views
3

[関数によって行列が追加された場合、data.framesは行列の列名を継承しているようです。例:data.frameが新しい列を取得するとどうなりますか?

blob <- matrix(11:20, ncol = 1, dimnames = list(NULL, "BLOB")) 
foo <- data.frame(FOO = 201:210) 

dat <- data.frame(id = 1:10) 

dat[, "new1"] <- blob 
dat[, "new2"] <- foo 

私は今datに見れば、それは私に

id BLOB new2 
1 11 201 
2 12 202 
3 13 203 
... 
ので

期待"new1"が示されていないが、"BLOB"を示しています。 colnames(dat)"id","new1","new2"であっても、さらに"BLOB"attributes(dat)にありません。dat[, "BLOB"]は「未定義列が選択されました」というエラーを示します。 つの質問:

  1. 、なぜこのような場合にはdatショー"BLOB"なく"new1"していますか?
  2. dat"BLOB"の代わりに"new1"と表示する方法を変更するにはどうすればよいですか?

答えて

2

data.frameの列に行列全体を代入すると、非常に奇妙なオブジェクトが作成されます。あなたがdatの構造を見れば、あなたはあなたはまだ行列の列を追加しました

'data.frame': 10 obs. of 3 variables: 
$ id : int 1 2 3 4 5 6 7 8 9 10 
$ new1: int [1:10, 1] 11 12 13 14 15 16 17 18 19 20 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : NULL 
    .. ..$ : chr "BLOB" 
$ new2: int 201 202 203 204 205 206 207 208 209 210 

が表示されます。そして、埋め込まれた行列が列名 "BLOB"を保持していることがわかります。ちょうど

dat[, "new1"] <- blob[,1] 

これはblobが複数の列を持つことができることが起こる理由とdata.frameの列に行列の列を割り当てるために、より安全になります。あなたはそれを "new1"に割り当てるだけで、他の列はどこに行くべきですか?したがって、列全体に行列が埋め込まれます。

あなたは

「BLOB」の列名を維持するだろうが、「BLOB」は colnames()

に記載されていることになるので、それは今、「ノーマル」data.frameだろう
do.call("cbind.data.frame", dat) 

に埋め込まマトリクスを拡大することができます

Rが埋め込み行列を持つdata.frameを印刷するとき、通常、行列の列名の前にdata.frame列名の前に接頭辞が付けられますが、列が1つだけの場合は、行列列名だけが使用されます)。観察:

mm<-matrix(1:9+10, nrow=3, dimnames=list(NULL, c("m1","m2","m3"))) 
data.frame(a=1:3, b = mm, c=letters[1:3]) 
# a b.m1 b.m2 b.m3 c 
# 1 1 11 14 17 a 
# 2 2 12 15 18 b 
# 3 3 13 16 19 c 
data.frame(a=1:3, b = mm[,1, drop=FALSE], c=letters[1:3]) 
# a m1 c 
# 1 1 11 a 
# 2 2 12 b 
# 3 3 13 c 

短いストーリー:data.frameに行列を入れないでください。

+2

'foo'のような' data.frame'を完全な列に割り当てることは、同様に危険です。 '< - foo [[1]]'または '< - foo [、1]'はうまく防御的です。 – Gregor

+0

@MrFlick、これまでの回答に感謝します。あなたは埋め込み行列が何であるか(その目的を含む)、そしてそれらをどのように扱うのかを説明する(または参照する)ことができますか? – Qaswed

関連する問題