No.01680 Rによるデータ抽出  【Rはじめました】 2006/11/29(Wed) 19:58

Rを始めたばかりの者です。色々本を読んで勉強しておりますが,独学ではなかなか進みません。超初心者的なことで,質問するのも恐縮ですが,何時間検討してもだめなので,質問させて頂きます。
例えば,
species <- c("A","B","A","C","D","E","A","B","E","A","C","B","D")
length <- c(13,20,14,18,18,13,14,17,18,14,19,20,15)
data <- matrix(c(species,length),13,2)
colnames(data) <- c("species","length")
というデータがあるとき,Aを抽出したいのですが,
data[data$species == "A",]
としても,うまくいきません。出力は
     species length
となります。どこに問題があるのでしょうか。

No.01681 Re: Rによるデータ抽出  【青木繁伸】 2006/11/29(Wed) 20:33

data が matrix であって,data.frame でないのがそもそもの原因ですね。
3行目の後に data <- data.frame(data) などとするととりあえずはうまくいきそうですが,それでは length が数値データでなくなってしまっていますのでエラーになります。
matrix は一種類の値しかとれないので,数値データと文字データがあるとどちらも factor になってしまうのです。
ということで,最初から data.frame にするのが定石ですね。
3行目を data <- data.frame(species=species, length=length) とすれば,列(変数)の名前も同時に付くので(=の左が列名),便利ですね。

No.01688 Re: Rによるデータ抽出  【Rはじめました】 2006/11/30(Thu) 08:59

青木先生,ご丁寧なアドバイスありがとうございました。
おかげさまで解決しました。
matrixでは,見かけ上の並びが違うだけで,1系列のデータということなのですね。納得です。
参考までにお聞きしておきたいのですが,
cbind(species,length)
でも,やはりMatrixと同じように,抽出ができませんが,Matrixと同じことなのでしょうか,もし何か違いがあるのであれば,ご教授頂きたくお願い致します。

No.01689 Re: Rによるデータ抽出  【青木繁伸】 2006/11/30(Thu) 09:05

n 行 m 列の行列を作るとき,

matrix は n×m の長さのベクトルを長さ n ずつに切って列に並べていくのです

cbind は長さ n のベクトル m 個を列に並べて n×m 行列を作ります

ちなみに,rbind は長さ m のベクトルを行に並べて n×m 行列を作ります
> x <- 1:12
> x
[1] 1 2 3 4 5 6 7 8 9 10 11 12
> matrix(x, 3, 4)
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> cbind(1:3, 4:6, 7:9, 10:12)
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> rbind(c(1,4,7,10), c(2,5,8,11), c(3,6,9,12))
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12

No.01690 Re: Rによるデータ抽出  【Rはじめました】 2006/11/30(Thu) 09:55

青木先生,ありがとうございました。
大変参考になりましt。

● 「統計学関連なんでもあり」の過去ログ--- 039 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る