裏 RjpWiki

文字通り,RjpWiki の裏を行きます
R プログラム コンピュータ・サイエンス 統計学

分散0の列を取り除く

2010年08月31日 | ブログラミング
piyo <- hoge[,apply(hoge,2,var) != 0]

というのがあったが,実際に何が行われるかはともかくとして,見かけ上は,
piyo <- hoge[,sd(hoge) > 0]
でよい。ここで,
piyo <- hoge[,var(hoge) > 0]
としてはいけない。
コメント

黄金四角形(黄金長方形)を R で描く

2010年08月31日 | ブログラミング
長い R プログラムも見たが,簡単に描くことができる。

phi <- (1+sqrt(5))/2
radian <- 90:180*pi/180
xy <- rbind(c(cos(radian), -1, 0, 0, -1), c(sin(radian), 1, 1, 0, 0))
par(mar=c(0, 0, 0, 0))
plot(c(-1, phi-1), c(0, 1), type="n", axes=FALSE, xlab="", ylab="", asp=1)
for (m in 1:11) {
    lines(t(xy))
    xy <- (matrix(c(0, -1, 1, 0), 2)%*%xy+c(0, 1/phi))/phi
}

実行結果は以下の通り

コメント

もっと簡単な方法がある

2010年08月30日 | ブログラミング
こんな風なcsvファイルがあったとする。
hoge, 2
fuga, 3
piyo, 1

これは文章中にhogeが2回、fugaが3回、piyoが1回出てきたというようなものを表わしている。ここで、このcsvの情報から単語 の登場回数の密度推定をやって欲しいとか言われたとする(ex:自然言語処理特論)。この情報から密度推定をしようと思うと、Rなら次のようなベクトルが 必要になる。

c(hoge, hoge, fuga, fuga, fuga, piyo)

これを,こんな風にしている
unlist(apply(d, 1, function(x){rep(x[1], x[2])}), use.names = FALSE)


もっと簡単な方法がある。以下のようにすればよい。
> rep(as.character(d$word), d$count)
[1] "hoge" "hoge" "fuga" "fuga" "fuga" "piyo"
コメント

大域変数への代入

2010年08月30日 | ブログラミング

差集合的なにかAdd StarwakutekaRion778

集合は定義から、同じ要素は含まないわけですが、そうゆうのも許して欲しいときがある。こういう2つのベクトルがあったとき

x <- c("a", "b", "c", "a", "a", "b")
y <- c("c", "d", "c")

Rでの差集合演算を使うともちろんこうなる。

> setdiff(x, y)
[1] "a" "b"

定義からいくともちろん正しいのだが

c("a", "b", "a", "a", "b")

で返ってきて欲しい場合もある。というわけで、ごねくりまわしてなんとかしてみた。頭が悪いので、きっともっとよい方法があるに違いない。まる。

大域変数への代入があるのであまりよくないが以下のようにすれば?

> lapply(y, function(i) x <<- x[!(x %in% i)])[[length(y)]]
[1] "a" "b" "a" "a" "b"

コメント (1)

居心地悪し

2010年08月30日 | ブログラミング
# 板倉-斎藤歪み距離
1 / length(f) * sum(f - y1 + exp(y1) / exp(f) - 1)


このように書いて欲しいなあ
sum(f - y1 + exp(y1) / exp(f) - 1) / length(f)
コメント

Tyukey 独自の発明でもないのかも

2010年08月25日 | 統計学
以下のようなカウント方法の画像が見つかる
上は一般的なもの
下はTukeyの方法に似ているもの

コメント

tally mark

2010年08月24日 | 統計学
中澤さんのページで

Tukeyが発明したという新しい集計図(tally figure)である。日本では正の字を使うが,英語圏では普通,横棒4本引いた後に縦棒を1本引く。これだと間違いやすいので,Tukeyは,まず正方 形の頂点をなすように点を打っていき,次いで辺を結び,最後に対角線を引くという10数える図を発明したそうだ。

横棒4本引いた後に縦棒を1本引く」ではなく,縦棒4本の後に横棒(斜め棒)ではないかな?



−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

tally figure はちょっと読む(勘定する)のも(描くのも)面倒だし,点と線分を同じ比重(共に1)で使っているのが難点では?
実際,以下の図の例で,41を42と読み違えているし。


コメント

要素数の異なる list の要素の度数分布

2010年08月20日 | ブログラミング
いつもの,石田さんのページ

要素の長さが違うリストからテーブルを作る 

もっとエレガントな方法(関数)があったような。

> a <- c("A","A", "B", "A")
> b <- c("A","B", "C", "A", "B")
> c <- c("C","A", "C", "B", "A", "B")
>
> abc <- list(a,b,c)
> names(abc) <- c("あ","い","う")
> abc
$あ
[1] "A" "A" "B" "A"

$い
[1] "A" "B" "C" "A" "B"

$う
[1] "C" "A" "C" "B" "A" "B"

>
> abc2 <- lapply(abc, table)
> abc2
$あ

A B
3 1

$い

A B C
2 2 1

$う

A B C
2 2 2

> abc3 <- lapply(abc2, data.frame)
> abc3
$あ
  Var1 Freq
1    A    3
2    B    1

$い
  Var1 Freq
1    A    2
2    B    2
3    C    1

$う
  Var1 Freq
1    A    2
2    B    2
3    C    2

> library(reshape)
 要求されたパッケージ plyr をロード中です
> melt(abc3)
Using Var1 as id variables
Using Var1 as id variables
Using Var1 as id variables
  Var1 variable value L1
1    A     Freq     3 あ
2    B     Freq     1 あ
3    A     Freq     2 い
4    B     Freq     2 い
5    C     Freq     1 い
6    A     Freq     2 う
7    B     Freq     2 う
8    C     Freq     2 う


あまりエレガントでもなく,代わり映えしないが,一応 1 行で書ける。

> data.frame(table(stack(abc)))
  values ind Freq
1      A  あ    3
2      B  あ    1
3      C  あ    0
4      A  い    2
5      B  い    2
6      C  い    1
7      A  う    2
8      B  う    2
9      C  う    2

Freq = 0 の行が含まれるけど,それを除くのは容易。

> x <- data.frame(table(stack(abc)))
> subset(x, x$Freq != 0)
  values ind Freq
1      A  あ    3
2      B  あ    1
4      A  い    2
5      B  い    2
6      C  い    1
7      A  う    2
8      B  う    2
9      C  う    2
コメント

なぜそうなるのか,私には説明できないのだが

2010年08月18日 | ブログラミング
Mac 版 R 2.11.1 で,以下のような場合,エラーも結果も出ない

> 514-47*874
>

"-" がおかしいんだ
16進コードで a1 dd

コマンドラインからR を起動して同じ入力をすると,エラーメッセージが表示される。

> 514-47*874
 エラー:   予想外の 入力  です  ( "514〓" の)

Windows 7 でも、エラーメッセージが表示される

> 514-47*874
 エラー:   予想外の 入力  です  ( "514" の)
コメント