裏 RjpWiki

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

単純に考える

2014年03月21日 | ブログラミング

Excel の列名(A,B,C,...)を数(1,2,3,...)に変換する についてだが,引数チェックはともかく,

ExcelColToNum = function(s) {
    s = unlist(strsplit(s, ""))
    x = which(LETTERS == s[1])
    if (length(s) == 2) {
        x = x*26 + which(LETTERS == s[2])
    }
    return(x)
}
x = c("A", "C", "Z", "AA", "AC", "ZZ")
sapply(x, ExcelColToNum)

で十分のような

コメント (1)

na.omit を使おう

2014年03月21日 | ブログラミング

生物系の人が苦しめられるあのデータ形式をRで扱いやすいように変換する

data1 = read.table("clipboard", header=TRUE)
data2 = stack(data1)
data = subset(data2, !is.na(values))

を紹介しているが,subset を使うよりは na.omit が単純明快

data = na.omit(stack(read.table("clipboard", header=TRUE)))

おまけ

dplyr を使えば
data = read.table("clipboard", header = TRUE) %.% stack() %.% subset(!is.na(values))

のように中間変数が要らないと自慢(?)しているが,上のように関数の入れ子の方が分かりやすい。

コメント (1)

どんな大発見なんだろうか

2014年03月16日 | 雑感

私見ではあるが,分野によっては,多くの研究者は数百万円の研究費で(場合によっては数十万円?),それこそ,世間からは「それがどれだけ重要な研究なの?」と思われるような研究をしているのかもしれない。
逆説的に言えば,さほど期待されていないからこそ,厳正に研究を行っている(ネガティブな結果しか得られませんでした,ゴメンナサイ的な)のではないか。
それがいいのか悪いのかと言われれば一概には言えないけど(最近の風潮では,ダメな研究,ダメな研究者,ダメな分野とみられるのだろうけど),科学者としての立場から言えば恥じることはないと,応援しよう。

鶏の胸肉を食べると疲労回復効果があるという研究に,30億掛かったという話も聞いた。

成果だけが功績じゃないよ。

コメント

ばば抜きのシミュレーション

2014年03月11日 | ブログラミング

ばば抜きのシミュレーション

夜中に目が覚めて,眠れないのでやってみた。答が違いそうなので,再検証が必要か。

sim = function(n.player = 3) {  # プレーヤーの人数
    check = function(x) { # ペアになるカードを除いて返す関数
        y = table(x) %% 2
        as.integer(names(y)[y != 0])
    }
    n = 53 %% n.player # カード配りをちょっとトリッキーに
    m = 53 %/% n.player + (n != 0)
    card = c(c(rep(1:13, 4), 14)[sample(53)], rep(NA, m*n.player-53))
    player = apply(matrix(card, m, byrow=TRUE), 2, na.omit) # 各プレーヤーの持ち札
    player = lapply(player, check) # 配り終えた後,各自でチェック
    counter = 0
    from = 1 # 1番目の人が2番目の人に引かれることから開始
    repeat {
        counter = counter+1
        n.player = length(player) # 残っているプレーヤーの人数
        if (n.player == 1) break
        to = if (from == n.player) 1 else from+1 # 最後の人のカードは1番目の人が引く
        z = player[[from]] # カードを引かれるプレーヤーの処理
        v = z[sample(length(z), 1)] # 無作為に1枚引かれる
        player[[from]] = setdiff(z, v) # 持ち札からなくなる
        if (length(player[[from]]) == 0) { # 持ち札が0枚なら上がり
            player[[from]] = NULL # プレーヤーをリストから消去
            if (to != 1) to = to-1 # カードを引くプレーヤーの番号は繰り下がる(1でない場合)
        }
        player[[to]] = c(player[[to]], v) # カードを引いたプレーヤーの持ち札
        player[[to]] = check(player[[to]]) # チェック
        if (length(player[[to]]) == 0) { # 持ち札が0枚なら上がり
            player[[to]] = NULL # プレーヤーをリストから消去
            if (to > length(player)) to = length(player)
        }
        from = to
    }
    counter
}
x <- replicate(1000, sim(26))
hist(x, right=FALSE)

コメント

算数パズルの解を求めるプログラム(その2)

2014年03月04日 | ブログラミング

子供がやってた算数問題(改)
http://r-statistics-fan.hatenablog.com/entry/2014/03/03/220956
 にあるプログラム。

あまり速くないと言われてる gtools の permutations() ではあるが,使い方によっては,べらぼうに速い。あっという間に解が得られる。(私も意外であったが)

 f3 = function() {
     library(gtools)
     x = permutations(10,4)
     apply(x, 1, function(y) {
         if (all(y != 6) && abs(y[1]-y[2]) == 6) {
             z1 = abs(diff(y))
             z2 = abs(diff(z1))
             z3 = abs(diff(z2))
             if (length(table(c(y, z1, z2, z3))) == 10) {
                 print(c(y, z1, z2, z3))
                 return
             }
         }
    })
    invisible()
 }
 > system.time(f3())
  [1]  9  3 10  8  6  7  2  1  5  4
    ユーザ   システム       経過  
       0.101      0.001      0.101

プログラム実行時間を短くするにはいくつかのやり方があるが,
1. 探索範囲を狭くする
2. 全体の実行時間を短くするためには,準備に実行時間をかければ,その努力は十分に報われることもある
というようなものもあるということで。

コメント

算数パズルの解を求めるプログラム

2014年03月04日 | ブログラミング

子供がやってた算数問題(改)
http://r-statistics-fan.hatenablog.com/entry/2014/03/03/220956
 にあるプログラム。

最初の部分を

    s = permutations(10)
    s = s[s[,5]==6,]

    a = b = c = d = e = f = g = numeric(nrow(s))

とするだけで,処理時間は元の 60% ほどになる。代入記号に = を使うのは,このブログの欠陥を回避するため。

permutations がほとんどの時間を取るので,それ以外の箇所をいじっても,あまり効果はなさそう。

コメント