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 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る