No.04660 R:関数 union について  【米澤】 2007/11/08(Thu) 16:36

連続で質問失礼します。No.4656 の質問でお答え頂いた方法で,x[[1]] x[[2]] ができました。前の質問を引きずることなく一般的に書きますと,配列 x1, x2 があったときに,その1列目にサンプルのコード振られている状況で(A001,A002・・・),そのコードのユニオンを取ろうと思いました。そこで codes <- union(x1[,1],x2[,1]) としてみたのですが,結果は上手く行きませんでした(codesには数字が帰ってきました。自分としては,A001,A002,A004・・・という2つ の行列に共通するコードが帰ってくると思ったのですが・・・・・)。試しに小さい行列を2つ作って,数字だけからなるコードを構成したところきちんと結果 が出ました。関数union は文字列が入っていると上手く動かないのでしょうか?または私の初歩的ミスでしょうか? 連続で簡単な質問で申し訳ありませんが,宜しくお願いします。

No.04661 Re: R:関数 union について  【青木繁伸】 2007/11/08(Thu) 17:14

うまく動かなかった例を示してもらうとよいと思います

行列ではなくデータフレームの方が良いと思いますので,以下に例を示します。
ちなみに,「2つの行列に共通するコード」が欲しいなら,intersect だと思いますよ。
この場合は,期待する通りの動きをしているようですが?
> x1<-data.frame(code=c("a001", "a003", "a010"), x=c(2,4,5))
> x2<-data.frame(code=c("a002", "a007", "a010"), x=c(1,5,9))
> union(x1[,1], x2[,1])
[1] "a001" "a003" "a010" "a002" "a007"
> intersect(x1[,1], x2[,1])
[1] "a010"

No.04671 Re: R:関数 union について  【米澤】 2007/11/09(Fri) 11:44

青木先生,毎回丁寧な解説ありがとうございます。さて,「共通の」ということでやはりintersectの事でし た。大変失礼しました。ただ,union も使いたいため,先生のプログラムを動かしてみましたところ,なぜかintersect は上手く行ったのですが union は上手く動きませんでした(私が小サンプルで行ったのはintersect の方でした)。Rのバージョンは2.4.1 ですが,バージョンの問題でしょうか? ご教授頂けたら幸いです。宜しくお願いします。

> x1<-data.frame(code=c("a001", "a003", "a010"), x=c(2,4,5))
> x2<-data.frame(code=c("a002", "a007", "a010"), x=c(1,5,9))
> union(x1[,1], x2[,1])
[1] 1 2 3
> intersect(x1[,1], x2[,1])
[1] a010
Levels: a002 a007 a010

No.04672 Re: R:関数 union について  【青木繁伸】 2007/11/09(Fri) 12:45

> Rのバージョンは2.4.1 ですが,バージョンの問題でしょうか?

そのとおり。
バグではないが,2.4.1 まではデータフレームに対応していない。
"CHANGES IN R VERSION 2.5.0" で,
union(), interect(), setdiff() and setequal() now coerce their arguments to be vectors (and they were documented only to apply to vectors).
と書かれている。
実際,R-2.4.1 でも,以下のような場合にはちゃんと動く。
> code1<-c("a001", "a003", "a010")
> code2<-c("a002", "a007", "a010")
> union(code1, code2)
[1] "a001" "a003" "a010" "a002" "a007"
> intersect(code1, code2)
[1] "a010"
あるいは,一度データフレームから取り出し「文字型」にしてから演算する
> x1code <-as.character(x1$code)
> class(x1code)
[1] "character"
> x2code <-as.character(x2$code)
> union(x1code, x2code)
[1] "a001" "a003" "a010" "a002" "a007"
> intersect(x1code, x2code)
[1] "a010"
自分のコンピュータなら最新バージョンをインストールしましょう。
古いバージョンでうまくいかないといわれても,「そうですか」としか言いようがない。
今回は,幸,古いバージョンをインストールしてあるので問題と解決策が確認できたけど,普通は「そうですか。バージョンを上げてください」と言われるだけす。

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