裏 RjpWiki

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

懐かしのライフゲーム

2012年12月21日 | ブログラミング

昔,BASIC で組んで喜んでいたものだ

10分ほどで組んで,チューニング

for を使っているけど,速すぎる。

ただ,図を描くのは一気呵成でないといけないので,rect で引数にベクトルを与えた。

life <- function(xy, step = 100, nrow = 100, ncol = nrow, sleep = 0) {
    a <- matrix(0, nrow, ncol)
    a[xy] <- 1
    nrow1 <- nrow - 1
    ncol1 <- ncol - 1
    old <- par(mar = c(0, 0, 0, 0))
    for (l in seq_len(step)) {
        b <- a
        plot(1, 1, type = "n", xlim = c(1, nrow), ylim = c(1, ncol), bty = "n", axes = FALSE, xlab = "", ylab = "")
        i0 <- j0 <- numeric(nrow * ncol)
        n <- 0
        for (i in 2:nrow1) {
            for (j in 2:ncol1) {
                if (a[i, j] == 0 && sum(a[(i - 1):(i + 1), (j - 1):(j + 1)]) == 3) {
                  b[i, j] <- 1
                } else if (a[i, j] == 1 && (sum(a[(i - 1):(i + 1), (j - 1):(j + 1)]) <= 2 || sum(a[(i - 1):(i + 1), (j -
                  1):(j + 1)]) >= 5)) {
                  b[i, j] <- 0
                }
                if (b[i, j]) {
                  n <- n + 1
                  i0[n] <- i
                  j0[n] <- j
                }
            }
        }
        i0 <- i0[1:n]
        j0 <- j0[1:n]
        rect(i0 - 0.5, j0 - 0.5, i0 + 0.5, j0 + 0.5, col = "red", border = "red")
        Sys.sleep(sleep)
        a <- b
    }
    par(old)
}
x <- rbind(cbind(rep(49, 11), 45:55), cbind(rep(50, 11), 45:55), cbind(rep(51, 11), 45:55))
life(x, step = 25)
x <- cbind(sample(100, 5000, replace = TRUE), sample(100, 5000, replace = TRUE))
life(x, step = 400)
x <- matrix(c(18, 11, 18, 29, 18, 30, 18, 31, 19, 12, 19, 29, 20, 10, 20, 11, 20, 12, 20, 31), byrow = TRUE, ncol = 2)
life(x + 30, step = 200)

コメント

ダメ出し:結果をもっとよく見よう

2012年12月21日 | ブログラミング

社会調査士のためのこれからの因子分析 on Rpubs

お詫びと訂正とやったね にて

訂正があったので,それはよしと

> mirtパッケージのconfmirt.model()関数で,カンマが含まれている複数行のモデルを書いていて,knitrするとエラーが生じるのは回避できませんでした。ので,Rpubsの方には載ってません。ご容赦ください。

これは,confmirt.model 関数の file 引数を使うことによって解決できる問題。

結果をよく見ようというのは,

result.mirt <- mirt(Science.n, 3, itemtype = "graded", rotate = "promax")
summary(result.mirt)

##
## Rotation:  promax
##
## Rotated factor loadings:
##
##                F_1    F_2    F_3    h2
## Comfort      0.293 -0.218  0.347 0.421
## Environment -0.113 -0.665 -0.039 0.429
## Work        -0.148  0.048  0.705 0.390
## Future       0.049  0.038  0.747 0.591
## Technology   0.077 -0.679 -0.141 0.449
## Industry    -0.069 -0.680  0.107 0.487
## Benefit      1.000  0.068  0.011 0.996

の部分。

Benefit の因子負荷量が 1.000 となっている(実際には 1 に限りなく近い値であるはず)。本当に 1 なのではなくて,収束計算中に因子負荷量が 1 より大きくなったので直前の会を使ったか,強制的に 1 にして収束計算を打ち切ったかであろう。
しかし,その実態は,不適切解(ヘイウッドケース)。そのまま解釈を進めるのでなく,何とか対処しなくては。

そのほか,grm についても,「Warning: 計算結果が NaN になりました」がたくさん出る。

RStudio,knitr, knitToHTML, RPubs 関連で,R のコードと結果を含む HTML 文書が氾濫しているが,本当に R のコードと結果のみというものが多い。そういうものは,文書とはいえない。他人も参考にしにくい(参考にならない)。コードや結果について何か書くという過程があれば,間違いや問題点に気づくのではないかなあとも思う。

 

コメント

ダメ出し:マスクされるオブジェクトに注意

2012年12月20日 | ブログラミング

(1)社会調査士のためのこれからの因子分析

(2)社会調査士のためのこれからの因子分析 で話が合わないなあと思ってよくよく見たら,

両方で,コマンドの入力順序で,分析対象のデータセットが違っている。

示されたように,

library(psych)
library(ltm) 
library(mirt)
data(Science)

の順で入力すると,Science は

  Comfort Work Future Benefit
1       4    4      3       2
2       3    3      3       3
3       3    2      2       3
4       3    2      2       3
5       3    4      4       1
6       4    4      3       3

になる。

しかし,著者は,(2)の方では,

> head(ltm::Science)
         Comfort       Environment           Work         Future     Technology       Industry           Benefit
1 strongly agree    strongly agree strongly agree          agree strongly agree          agree          disagree
2          agree    strongly agree          agree          agree          agree          agree             agree
3          agree          disagree       disagree       disagree strongly agree strongly agree             agree
4          agree             agree       disagree       disagree strongly agree strongly agree             agree
5          agree strongly disagree strongly agree strongly agree       disagree          agree strongly disagree
6 strongly agree             agree strongly agree          agree          agree strongly agree             agree

を使用した結果を示している。

示された順でコンソール入力すると,library(mirt) の後に,

>  次のパッケージを付け加えます: '‘mirt’'
> The following object(s) are masked from ‘package:ltm’:
>     Science

が出ている。つまり,mirt と ltm のローディングの順序で,実際に使われる Science の内容が異なるということである。

著者は,(1)の方で,以下のような矛盾に気づいていない(私も,さっき気づいたばかり)。

> サンプルデータはltmパッケージにあるScienceデータを使います。4件法で7つの項目があります。← 4つの項目しかない
> data(Science)
> summary(Science)
> ##     Comfort          Work          Future        Benefit   
> ##  Min.   :1.00   Min.   :1.00   Min.   :1.00   Min.   :1.00 
> ##  1st Qu.:3.00   1st Qu.:2.00   1st Qu.:3.00   1st Qu.:2.00 
> ##  Median :3.00   Median :3.00   Median :3.00   Median :3.00 
> ##  Mean   :3.12   Mean   :2.72   Mean   :2.99   Mean   :2.84 
> ##  3rd Qu.:3.00   3rd Qu.:3.00   3rd Qu.:3.00   3rd Qu.:3.00 
> ##  Max.   :4.00   Max.   :4.00   Max.   :4.00   Max.   :4.00

最初の方に,

> 途中,エラーが出たりRそのもののアウトプットと異なる場所がありますが,おそらくknitrあたりの問題で,実際はちゃんと結果が出てたりします。

と書いてあったのは,このことか???

このようなことを避けるためには,データの場合には,mirt::Science とか ltm::Science のようにちゃんと書き分けて,混乱が生じないようにする必要があるということだ。

コメント

ダメ出し:バグというのは早計で,使い方を反省すべきかも

2012年12月19日 | 統計学

 社会調査士のためのこれからの因子分析 にて

> 因子分析も連続変数と見なした古典的方法と,ポリコリック相関係数をつかった方法,両方で見てみましょう。 まずは古典的方法から。

> fa.result.n <- fa(Science.n, nfactors = 3, fm = "ml", rotate = "promax")

> ## In fa, too many factors requested for this number of variables to use SMC
> ## for communality estimates, 1s are used instead

変数の個数が 4 個であるにもかかわらず,因子数を 3 に指定(nfactors = 3)したら,こういうエラーメッセージ(too many factors requested)も出ようというもの。なぜ,それを無視して話を進めるのか,理解に苦しむが。

> ## Error: 'x' must be an array of at least two dimensions

> まあ他にも色々できるようですが,まだちょっと関数の挙動が怪しかったりします。

色々エラーが出るというのは,解析の条件設定に無理があるのではないかな?

> 警告が出るのでちょっと推定がうまくいってないかもです

そうかもね

コメント

ダメ出し:分析に使用する変数

2012年12月19日 | 統計学

主成分分析をやる にて

> 主成分分析を行う。
> respca <- prcomp(data0[, -c(1:3)])

というのは,まずい。

用いたデータには,試合数,打席数,安打数などの計数値と,長打率,安打率のような割合が混在している。このような場合には,変数は標準化したほうがよい(しない方がよいという観点もあるが)。

ということで,少なくとも,

respca <- prcomp(data0[, -c(1:3)], scale. = TRUE)

としたほうがよいと思われる。

また,長打率,安打率が使われている意味を考えると,安打数,二塁打数などというのも,打数(または打席数)に対しての率のデータにして使う方がよいだろう。安打数が同じ10でも,20打席の場合と100打席の場合では意味が異なる。もっとも,打席数(出場試合数)が多い選手は,成績が同じでも優れているという評価になるかもしれないが。


いずれにせよ,分析にどのような変数を使うべきかは,各分野の固有科学が解答を出してくれる(固有科学から解答を見いだす必要がある)ということではあろう。

コメント

ダメ出し:妙な数値表記

2012年12月10日 | ブログラミング

湿度諸量の計算法(まとめ) でみかけた

Okada <- function(t) {
  ## 入力:気温(℃)
  ## 出力:飽和水蒸気圧(hPa)
  exp(1.809378 +
      0.07266115 * t +
      (-3.003879 * 10^-4) * t^2 +
      (1.181765 * 10^-6) * t^3 +
      (-3.863083 * 10^-9) * t^4)
}

Okada2 <- function(t) {
  ## 入力:気温(℃)
  ## 出力:飽和水蒸気圧(hPa)
  exp(1.809378 +
      0.07266115 * t -
      3.003879e-4 * t^2 +
      1.181765e-6 * t^3 -
      3.863083e-9 * t^4)
}

Okada3 <- function(t) {
  ## 入力:気温(℃)
  ## 出力:飽和水蒸気圧(hPa)
  exp((((-3.863083e-9 * t + 1.181765e-6) * t -3.003879e-4) * t + 0.07266115) * t + 1.809378)
}

> options(digits=16)
> Okada(30)
[1] 42.42093319229595
> Okada2(30)
[1] 42.42093319229595
> Okada3(30)
[1] 42.42093319229597

Okada2 と Okada3 では,計算量が違う(Okada3 の方が多項式を計算するための定石手段)。

コメント

ダメ出し:NA の存在するデータの多変量解析にご注意

2012年12月10日 | ブログラミング

Outlines of Factor Analysis (2); estimation / rotation でのことだけど

一番最後の

> 因子得点の基本的な特徴を再確認

> summary(result.fa$scores)

> ##       ML2               ML1        
> ##  Min.   :-2.2878   Min.   :-2.206  
> ##  1st Qu.:-0.6640   1st Qu.:-0.604  
> ##  Median :-0.1128   Median : 0.148  
> ##  Mean   :-0.0094   Mean   : 0.018  
> ##  3rd Qu.: 0.6678   3rd Qu.: 0.809  
> ##  Max.   : 2.2048   Max.   : 2.411  
> ##  NA's   :3         NA's   :3

因子得点の平均値が 0 になっていないのは,分析に NA を含むデータを除かなかったため。

fac_data <- na.omit(fac_data)

として,同じように分析を進めれば,以下のようにちゃんと平均値は0になる。fac_data では NA を含むデータが少ないので影響も小さいが,NA がたくさんあるデータだとどうなるかな?

これは,fa のバグなんだろうか?

> summary(result.fa$scores)
      ML2               ML1         
 Min.   :-2.2664   Min.   :-2.2769  
 1st Qu.:-0.6572   1st Qu.:-0.6321  
 Median :-0.1007   Median : 0.1331  
 Mean   : 0.0000   Mean   : 0.0000  
 3rd Qu.: 0.6697   3rd Qu.: 0.7946  
 Max.   : 2.1988   Max.   : 2.4392  

コメント

ダメ出し:R で学ぶデータ・プログラミング入門 ―RStudioを活用する― その5

2012年12月07日 | ブログラミング

おまけで

163 ページで,コイン投げの結果をヒストグラムで描いている。「不適切である」と指摘した理由がわからない人もいるかもしれないので,以下のような例を挙げておく。

全試行回数は 10000 にしたが,ヒストグラムを描く breaks は著書の通り。

ヒストグラムはまずいというのは,一目瞭然。棒グラフを描くべし。

> layout(matrix(1:2, 2))
> x <- c("表", "裏")
> z <- numeric(10000)
> set.seed(123)
> for (i in 1:10000) {
+     y <- sample(x, 10, rep=TRUE)
+     z[i] <- sum(y == "表")
+ }
> freq <- table(z)
> hist(z, breaks=0:10)
> barplot(freq, main="Barplot of table(z)")
> layout(1)
> freq
z
   0    1    2    3    4    5    6    7    8    9   10
   7  108  415 1140 2036 2470 2047 1203  467  102    5

 



コメント

ダメ出し:R で学ぶデータ・プログラミング入門 ―RStudioを活用する― その4

2012年12月07日 | ブログラミング

● 184 ページ 下から 6 行目
キロ → 0.5 キロ

● 185 ページ 上から 4 行目
H0 → 0 は添え字(下付)

● 186 ページ 下から 5 行目
 → 適

● 186 ページ 下から 2 行目
2標本の平均値の検定 → 独立2標本の平均値の検定
 R の用語法もおかしいのだけど,統計学の常識としてこれはちゃんと「独立2標本の」といわなければおかしい。特に,あとで,対応のある2標本のお話が出てくるのだから余計に。

● 197 ページ 上から 2 行目
csv → CSV
 他では大文字になっているのだから統一

● 200 ページ 上から 13 行目
欧米の → アメリカ
 他にも2箇所出てくるが,いつも曖昧に書いている。ぼかして書く意味がない。

● 205 ページ 上から 2 行目
カイ二乗分布は自由度が大きくなると正規分布の形状に近づく分布
 自由度がνのカイ二乗分布は,平均値がν,分散が2νである。正規分布においては平均値と分散は独立である。よって,カイ二乗分布は正規分布で近似できるようなものではない

● 208 ページ 上から 5 行目
この値を 1 から引き算すれば,指定されたカイ自乗値より大きな数値が出る確率が求まります。
 その下に書いてあるように,lower.tail=FALSE を指定するのが正しいやり方。統計的判断に影響のあるような違いではないが,丸め誤差などの影響で表示される結果が異なることがある。
> 1-pchisq(50, 1)
[1] 1.537437e-12
> pchisq(50, 1, lower.tail=FALSE)
[1] 1.53746e-12
> options(digits=16)
> 1-pchisq(50, 1)
[1] 1.537436844500917e-12
> pchisq(50, 1, lower.tail=FALSE)
[1] 1.537459794428036e-12

● 210 ページ 表のタイトル
選挙前後に内閣支持率の変動 → 選挙前後における内閣支持率の変動 または 選挙前後内閣支持率の変動
 それにしても,この本における表組みは変。編集段階で何とかならなかったのか?

● 212 ページ
 一元配置分散分析に aov を使っているが,なぜ oneway.test を使わないのだろうか?教科書的な分散分析表が欲しいのか?
> oneway.test(weight ~ group, data=PlantGrowth)

    One-way analysis of means (not assuming equal variances)

data:  weight and group
F = 5.181, num df = 2.000, denom df = 17.128, p-value = 0.01739

> oneway.test(weight ~ group, data=PlantGrowth, var.equal=TRUE)

    One-way analysis of means

data:  weight and group
F = 4.8461, num df = 2, denom df = 27, p-value = 0.01591
 2 通りの検定結果を示したが,オンラインヘルプをみてもわかるように,t.test と同じく,var.equal 引数を持つ。すなわち,aov を使った検定は,var.equal=TRUE の方である。t.test で Welch の方法を勧めるなら,一元配置分散分析でも Welch の方法,つまり var.equal=FALSE をとるべき。そして,そちらが t.test と同じくデフォルトになっているのだから。

● 215 ページ 上から 4 行目
そこで 1 から引きます
 208 ページでも言及したが lower.tail=FALSE を使用すべし

● 217 ページ 上から 15 行目
歯の生長と,ビタミンCの与える効果 → 歯の生長にビタミンCが与える効果

● 221 ページ 上から 7 行目
の間の数値となり → の間の数値になり

● 221 ページ コラム
変数 X と Y それぞれの分散です → 変数 X と Y それぞれの変動です
一方,Sxy は共分散といいます → 一方,Sxy は共変動といいます
 下の Sxy の定義を見ればわかるように,Sxy は共変動。だったら,Sx, Sy も変動
 なお,説明中に出てくる「変動」は「ずれ(変動)」と書かれているように,統計学での「変動」とは違うので紛らわしい。

● 224 ページ 上から 3 行目
係数の誤差 → 係数の標準誤差

● 224 ページ 下から 13 行目
帰無仮説「係数がすべて 0 である」
 その次に「回帰式には意味がない」と書いてある方が正確。ただし,ここは単回帰の話なので,回帰係数の検定と同じ意味なので,「係数が 0 である」と同じになる。

● 224 ページ 上から 11 行目
ここでは p 値がほぼ 0 ですので棄却されます
 上に書いたように,単回帰の場合には理論的に,この p 値は回帰係数の検定の p 値と全く同じになる。

● 240 ページ 下から 11 行目
ai,1,ai,2 → 二重添え字を区切るカンマはいらない
 上の方の独立式では余分なカンマはないので,文中では Sx1,x2 のように余分なカンマがある。以後のページでは,軒並み余分なカンマが使われている。

● 250 ページ 下から 4 行目
海外のある大学で → アメリカの大学
 ぼかす必要はない

● 252 ページ 下から 10 行目
含まれていますので → 含まれているので

● iii ページ 下から 8 行目
新規な知見が → 新しい知見
 「新規」という言葉に続くのは「に」とか「の」。「な」はなんとなく変な気がする。

● iii ページ 下から 5 行目
スクリーニング  ???
 スクリーニングとは篩(ふるい)に掛けること。つまり,条件に合うデータをふるい分けて取り出すことでは?
 「すなわちデータの整形が必要となりますが」と続けているので,「クリーニング」でもない。???

● iv ページ 上から 2 行目
それは R では,(中略)意図されています。 → それは R では,(中略)意図されているからです。

● iv ページ 下から 6 行目
Gihub → Github

文章上のこまかい言い回しについては異論もあるでしょうけど...

はい,一段落ついた

コメント (2)

ダメ出し:R で学ぶデータ・プログラミング入門 ―RStudioを活用する― その3

2012年12月06日 | ブログラミング

● 104 ページ 上から 2 行目
検索をかけて → 検索して

● 107 ページ 上から 4 行目
関数ですので → 関数なので

● 107 ページ 最下行
作図領域の外の → 描画領域の外の

● 109 ページ 1 行目
プロットの形状を → プロット記号の形状

● 109 ページ 上から 2 行目
4.6 節に紹介 → 4.6 節で紹介

● 109 ページ 上から 4 行目
サイズは cex に → サイズは cex で

● 110 ページ コラムの上から 3 行目
長い警告
 確かに長いけど,『「長いオブジェクトの長さが」云々という警告』といいたかったのかな?

● 110 ページ コラムの下
これに対して
 唐突感。前に戻ってみたら『「高水準グラフィック関数」に対して』ということなんだなあ。

● 110 ページ 下から 2 行目
第 1 引数で指定した座標点に
 これは知らなかった。でも,ちょっと特殊な例では?

● 117 ページ 下から 3 行目
花びら(Sepal)およびガク(Petal)の横幅 → 花びら(Petal)およびガク(Sepal)の

● 121 ページ 上から 3 行目
インストールされていませんので → インストールされていないので

● 124 ページ 上から 1 行目
いますので → いるので

● 128 ページ 上から 4 行目
横軸のカテゴリに順序があります
 ヒストグラムの階級をカテゴリといっても構わないとは思うし,確かに順序はあるが,大きな違いは,「横軸は連続変数である」ということでしょう。

● 128 ページ 下から 8 行目
「高さ」を 5 フィートの区分に分け → 「高さ」を階級幅 5 フィートの階級に分け

● 128 ページ 下から 7 行目
実は hist() 関数を実行した際, → 実行例は hist() 関数を用いた際に

● 129 ページ 上から 12 行目
区間分けの情報 → 階級分けの情報

● 129 ページ 最下行
多くの場合,丸括弧を省き,関数名だけを → 多くの場合,関数名だけを

● 130 ページ 下から 4 行目
桁を切り上げます → その数より大きい最小の整数を返します

● 133 ページ 上から 8 行目
信頼区間とは,中央値が 95% の割合で位置する範囲 → 信頼区間とは,同様の手続きで中央値の存在範囲を推定したとき 100 回中 95 回はその範囲に母中央値が含まれる区間を表しています。
 表現が難しいけど。11 ~ 13 行もまずい。
 183 ページの説明は正しい。

● 133 ページ 下から 6 行目
A, B, ..., F と → A, B, ..., F の

● 135 ページ 上から 3 行目
この場合, → このようにした場合は,

● 143 ページ 上から 1 行目
データ分析について → データ解析について

● 144 ページ 上から 6 行目
痩せることのできる → 痩せることができる

● 144 ページ 上から 9 行目
半キロ → 0.5 キロ

● 144 ページ 下から 9 行目
300 世帯 → 600 世帯
 いつの頃からか,関東地方では 600 世帯を対象にするようになっているはず

● 145 ページ 下から 14 行目
 この視聴率の信頼区間の説明は 133 ページと同じく,まずい

● 145 ページ 下から 7 行目
行います → 始めます

● 146 ページ 上から 1 行目
男女それぞれの数 → 男女それぞれの人数

● 147 ページ 下から 9 行目
単位が絶対的な原点とはならないからです → 単位に絶対的な原点がないからです

● 147 ページ 下から 2 行目
カテゴリカル変数 → カテゴリー変数

● 149 ページ 下から 5 行目
桁数を大きく取れば → 桁数を多く取れば または 桁数をたくさん取れば

● 149 ページ 下から 2,3 行目
連続量データ 離散値データ → 連続データ 離散データ

● 151 ページ 上から 12 行目
プログラミング言語では長さともいいます → ベクトルの長さともいいます
 他の言語ではしいて言えば,サイズとかいいませんか?

● 150 ページ 下から 3 行目
並び替えて → 並べ替えて

● 154 ページ 上から 5 行目
これが分散(variance)です
 中央値と四分位範囲の関係からいえば,平均と対応するのは標準偏差でしょう(後の方にはそう書いてあるし)

● 154 ページ 上から 10 行目
以下で定義を,文章と数式のそれぞれで示します → 以下で,文章と数式のそれぞれで定義を示します

● 155 ページ 上から 13 行目
データ数から 1 を引いた結果を求めています → データ数から 1 を引いた数で割って結果を求めています

● 157 ページ 最終行
ヒストグラムの区間を → ヒストグラムの級限界を

● 158 ページ 上から 1 行目
区間に属するデータ数 → 階級に属するデータ数

● 160 ページ 下から 3 行目
ひえ → ヒエ

● 163 ページ 下から 14 行目
ヒストグラムを作成してみましょう
 ヒストグラムは不適切。離散データなのだから barplot 関数を使うべき。

● 169 ページ 上から 9 行目
データは以下でした → データは以下のようでした

● 169 ページ 下から 3 行目
という数値が → というような数値が

まだおわんない...

コメント

ダメ出し:R で学ぶデータ・プログラミング入門 ―RStudioを活用する― その2

2012年12月06日 | ブログラミング

● 66 ページ 上から 10 行目
そこで以下, → そこで以下

● 69 ページ 中程の 2 つのプログラム片
tmp <- 0
for (i in 1:3) {
  for (j in 1:3) {
    tmp <- tmp+x[i, j]
  }
  print(tmp)
  tmp <- 0
}
  ↓
for (i in 1:3) {
  tmp <- 0
  for (j in 1:3) {
    tmp <- tmp+x[i, j]
  }
  print(tmp)
}

tmp <- 0
for (i in 1:3) {
  for (j in 1:3) {
    tmp <- tmp+x[j, i]
  }
  print(tmp)
  tmp <- 0
}
  ↓
for (i in 1:3) {
  tmp <- 0
  for (j in 1:3) {
    tmp <- tmp+x[j, i]
  }
  print(tmp)
}
 適切なときに適切に初期化する

● 70 ページ 上から 2 行目
任意の演算子ないし関数 → 任意の関数
 "+" は演算子ではなく関数

● 76 ページ 上から 2 行目
 地の文で文字列をくくる引用符がここだけちゃんと“ ”になっている(そうあるべきなのだが)。ほかは全部 ” ”になっていて,気持ち悪いことこの上ない。せめて " " ならまだしも。

● 77 ページ 上から 2 行目
関数か@演算子 → 関数か @ 演算子
 漢字・ひらがなと英字・記号がくっつきすぎているところが散見される。

● 79 ページ 下から 14 行目
行列みなされる → 行列とみなされる

● 79 ページ 下から 13 行目
関数を 1 行 9 列と扱う → 関数を使って 1 行 9 列として扱う

● 80 ページ 下から 14 行目 最後の 2 行も関連で
第 3 引数に演算子を指定 → 第 3 引数に演算を表す関数を指定
 第 3 引数に指定するのは関数。

● 79 ページから始まる九九表の作成プログラム
最終的に,
paste(outer(1:9, 1:9, paste, sep="*"), outer(1:9, 1:9, "*"), sep="=")
として,82 ページのコラムの上で,「なお上記の出力では,横幅が足りないために,"9*9=81" が最後に行送りされています」と書いている。
生成されるのがベクトルなんだから,横幅を制御して 9 行 9 列にしようというのは何だろう(コラムでは 83 ページの下に「width を 90 に設定するのが適切でしょう」と書いている)。
せめて,この結果を matrix 関数で 9 行 9 列にすべきだろう。
matrix(paste(outer(1:9, 1:9, paste, sep="*"), outer(1:9, 1:9, "*"), sep="="), 9)
しかし,そもそも,outer を 2 回使う必要はない。第 3 引数には 2 つの引数が渡されるので,無名関数を使えば,その引数は何回でも使える。
ということで,以下のように単純明快に書ける。
outer(1:9, 1:9, function(x, y) sprintf("%i*%i=%i", x, y, x*y))
      [,1]    [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]    
 [1,] "1*1=1" "1*2=2"  "1*3=3"  "1*4=4"  "1*5=5"  "1*6=6"  "1*7=7"  "1*8=8"  "1*9=9"
 [2,] "2*1=2" "2*2=4"  "2*3=6"  "2*4=8"  "2*5=10" "2*6=12" "2*7=14" "2*8=16" "2*9=18"
 [3,] "3*1=3" "3*2=6"  "3*3=9"  "3*4=12" "3*5=15" "3*6=18" "3*7=21" "3*8=24" "3*9=27"
 [4,] "4*1=4" "4*2=8"  "4*3=12" "4*4=16" "4*5=20" "4*6=24" "4*7=28" "4*8=32" "4*9=36"
 [5,] "5*1=5" "5*2=10" "5*3=15" "5*4=20" "5*5=25" "5*6=30" "5*7=35" "5*8=40" "5*9=45"
 [6,] "6*1=6" "6*2=12" "6*3=18" "6*4=24" "6*5=30" "6*6=36" "6*7=42" "6*8=48" "6*9=54"
 [7,] "7*1=7" "7*2=14" "7*3=21" "7*4=28" "7*5=35" "7*6=42" "7*7=49" "7*8=56" "7*9=63"
 [8,] "8*1=8" "8*2=16" "8*3=24" "8*4=32" "8*5=40" "8*6=48" "8*7=56" "8*8=64" "8*9=72"
 [9,] "9*1=9" "9*2=18" "9*3=27" "9*4=36" "9*5=45" "9*6=54" "9*7=63" "9*8=72" "9*9=81"
sprintf 関数なんて持ち出したくないなあということならば,paste 関数で以下のごとく。
outer(1:9, 1:9, function(x, y) paste(x, "*", y, "=", x*y, sep=""))

● 83 ページ 下から 15 行目
小数点以下の桁数の指定 → 有効数字の指定
 デフォルトの状態で 12.345678 と 123.45678 を入力してみるとわかる

● 92 ページ 上から 14 行目 及び関連して下から 7 行
文字列を操作する方法を正規表現といいます → 文字列を指定する方法を正規表現といいます

● 93 ページ 上から 14 行目
パターンを探すのが → パターンを表すのが

● 93 ページ 上から 17 行目
文字列全体を指定 → 文字列を指定

● 93 ページ 下から 2 行目
空白(””) → (””)

● 95 ページ 上から 15 行目
もとのベクトルで位置番号 → もとのベクトルでの位置番号

● 95 ページ 上から 19 行目
関数そのものを添え字に → 関数の結果を添え字

● 95 ページ 上から 21 行目
全ての列をそのまま残すという意味 → その行全部という意味

● 96 ページ 上から 15 行目
データフレームを列で並び替えを行う → データフレームを特定の列の値の順序で並べ替えを行う

● 97 ページ 上から 14 行目
指定した順に → 指定した変数の値の順に

● 97 ページ 上から 15 行目
name で重複する要素 → name の値が同順位の要素

● 98 ページ 下から 15 行目
間にカンマを挟めば → カンマで区切れば

まだつづく...

コメント