裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

dplyr って,本当に便利なの?

2015年02月02日 | ブログラミング

dplyr で mutate に ifelse が使えるんすねって話。」で,

> irisのデータにSpeciesを元にしてカテゴリーっぽい物を追加しています。
> 二つ目ではifelseを重ねています。
> data %>% mutate(category = ifelse(Species == “setosa”, “A”, ifelse(Species == “virginica”, “B”, “C”)))

iris$category = factor(iris$Species, levels=c("setosa", "virginica", "versicolor"), labels=LETTERS[1:3])

の方が,分かりやすいと思います。分類が10個になったら,ifelse を 9 層にするおつもりですか?

コメント (1)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

タロット占い

2015年02月02日 | ブログラミング

1 ~ n までの数字が 1 つずつ書かれた n 枚のカードがある。
先頭のカードの数字を見て,その数字の枚数分を先頭から上下逆さに変え,最初の解-度を末尾に移動するということを繰り返す。
操作の途中で,全てのカードが上下逆になるような場合もあるし,カードの状態がループし,全てのカードが上下逆になることはないこともある。
全てのカードが上下逆になるような最初の並び順は何通りあるか。

n = 3 のときは,1,2,3 の並び順の場合は全て上下逆になるが,1,3,2 の場合は,全て上下逆になることはなくループに陥る。


allReverse = function(n) {
  func = function(x) {
    rev = logical(n)
    x0 = x
    repeat {
      rev[1:x[1]] = !rev[1:x[1]]
      x = c(x[2:n], x[1])
      rev = c(rev[2:n], rev[1])
      if (all(rev))
        return(TRUE)
      else if (all(x == x0) && all(rev == FALSE))
        return(FALSE)
    }
  }
  library(e1071)
  a = permutations(n)
  pos = apply(a, 1, func)
  invisible(list(count = nrow(a[pos, ]), pattern = a[pos, ]))
}
allReverse(7)$count

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

エジプト式分数

2015年02月02日 | ブログラミング

ある分数を,分子が 1 の分数の和で表す
1/3 でも,1/4 + 1/12 のようにすること

EgyptianFraction = function(numerator, denominator) {
  EF = function(numerator, denominator) {
    denominator2 = 1
    repeat {
      denominator2 = denominator2 + 1
      if (denominator < numerator * denominator2)
        break
    }
    answer <<- c(answer, denominator2)
    numerator2 = numerator * denominator2 - denominator
    denominator2 = denominator * denominator2
    gcd = GCD(numerator2, denominator2)
    numerator2 = numerator2/gcd
    denominator2 = denominator2/gcd
    if (numerator2 == 1)
      answer <<- c(answer, denominator2)
    else if (numerator2 != 0)
      Recall(numerator2, denominator2)
  }
  GCD = function(x, y) {
    while (y%%x != 0) {
      t = y%%x
      y = x
      x = t
    }
    x
  }
  cat("\n", numerator, "/", denominator, "== ")
  answer = NULL
  EF(numerator, denominator)
  cat(sub("^ \\+ ", "", paste(" + 1 /", answer, collapse = "")), "\n")
  check = TRUE
  if (check == TRUE) {
    library(gmp)
    left = as.bigq(numerator)/as.bigq(denominator)
    right = sum(as.bigq(1)/answer)
    print(left, initLine = FALSE)
    print(right, initLine = FALSE)
    if (left != right) {
      cat("Warning! wrong answer\n")
      cat(numerator, denominator, "\n")
    }
  }
  invisible(answer)
}
EgyptianFraction(3, 5)
EgyptianFraction(5, 7)
EgyptianFraction(1, 3)
dat = cbind(numerator = c(66, 80, 2, 235, 40, 168, 72, 146, 5, 112, 148, 95, 106, 210, 92, 31,
  137, 177, 30, 22), denominator = c(152, 416, 90, 300, 159, 340, 115, 451, 6, 254, 285, 247,
  206, 377, 228, 222, 218, 398, 94, 39))
options(scipen = 10)
for (i in 1:20) {
  EgyptianFraction(dat[i, 1], dat[i, 2])
}

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村