http://www.md.tsukuba.ac.jp/epidemiology/~mokada/ml/R-jp.html
というのがあります。
私も昨日参加しました。
早速,そこで setm and leaf について書いていますが,ふさわしくないだろうか。みんなおとなしいみたいです。http://www.md.tsukuba.ac.jp/epidemiology/ML/R-jp/20020111/370.html
base に含まれている stem 関数は,デフォールトの設定が思わしくないのです。
とても満足がいくものではないですが,プロトタイプとして。
データのチェックなどは何もしていません。
3箇所もある for ループが汚いです。
R(S)で,for のあるプログラムは書きたくないです。
文字列操作関数を捜す必要があります。
my.stem の第2引数は,データの倍率を表します。
とはいっても,10のべき乗の数でないといけません。
get.factor <- function(x)
{
min0 <- min(x)
max0 <- max(x)
for (i in -10:10) {
ll <- trunc(max0*10^i)-trunc(min0*10^i)
if (ll > 5 && ll < 30) {
return(10^i)
}
}
return(1)
}
my.stem <- function(d, f=0)
{
if (f == 0) {
f <- get.factor(d)
}
temp <- trunc(d*f*10)
stem <- trunc(temp/10)
leaf <- (abs(temp)-abs(stem*10))
stem <- ifelse(stem == 0, ifelse(d > 0, 0, -0.000000001), stem)
df <- data.frame(aa=d,ab=temp,bb=stem,cc=leaf)
res <- table(stem,leaf)
nstem <- length(dimnames(res)$stem)
nleaf <- length(dimnames(res)$leaf)
for (i in 1:nstem) {
cat(ifelse(dimnames(res)$stem[i] == "-1e-09", "-0", dimnames(res)$stem[i]), "| ")
line <- ""
for (j in 1:nleaf) {
if ((c <- res[i,j]) > 0) {
digit <- dimnames(res)$leaf[j]
for (k in 1:c) {
line <- paste(line, digit, sep="")
}
}
}
cat(line, "\n")
}
cat("stem * ", 1/f, "\n")
}
d <- rnorm(200)
my.stem(d)
my.stem(d,10)