1. ホーム
  2. R

8.2 カマグラ(No.31〜No.40)

2022-01-22 19:15:43
<パス

8.2 カマグラ (No.31~No.40)の場合

8.2.31 subset

機能 subset は、対話的な使用における利便性を提供することを目的としています。関数で使用すると、しばしば不便や苦痛を感じることがあります。関数を使用する場合は、添え字を使用するのではなく subset .

患者さん 先生、これをやると痛いんです。
ドクター それなら、こんなことしないでください。

これは subset の動作例です。

> xdf5 <- data.frame(R=1:2, J=3:4, E=5:6, K=7:8)
> subset(xdf5, select=J:K)
  J E K
1 3 5 7
2 4 6 8
> subset(xdf5, select=-E)
  R J K
1 1 3 7
2 2 4 8


パラメータを使用すると 非常に 非標準の ":" "-" 演算を行うことができます。これにより、インタラクティブな使用における利便性とスピードがもたらされます。このようなトリックが他の文脈でも使えると期待することは、ユーザーにとって重大な危険である。インタラクティブな用途であっても J:K をデータフレーム内の順序ではなく、アルファベットに従うようにすることも非常に危険である。

なお、1列しか選択されていない場合でも subset はデータボックスを返します。

8.2.32 subset の中に = ==

次の2つのコマンドには、非常に大きな違いがあります。

subset(Theoph, Subject = 1)


そして

subset(Theoph, Subject == 1)


最後が期待するもので、前者は何もしません。

8.2.33 セパレート sample 選択

機能 sample には、いつも役に立つとは限らない機能があります。その第一引数には、サンプルの開始から終了までの項目を指定するか、選択するデータ中の数値を指定することができます。ここで摩擦が生じるのです。

> sample(c(4.9, 8.6), 9, replace=TRUE)
[1] 4.9 4.9 8.6 4.9 8.6 4.9 8.6 4.9 8.6
> sample(c(4.9), 9, replace=TRUE)
[1] 2 3 3 2 4 4 3 4 1


データが数値で、最小値が1で、長さが1である場合(いわば関数での選択による)、サンプリングリミットとして解釈される。上の例のデータは、最も近い整数にスケールダウンされていることに注意してください。

これは、文字系データを作るコードの組み合わせが複雑なのです。

> as.numeric(sample(as.character(c(4.9)), 9, replace=TRUE))
[1] 4.9 4.9 4.9 4.9 4.9 4.9 4.9 4.9 4.9


8.2.34 セクションの名前を変更する

R は、宣言を置き換えるために深堀りするのがうまい。例えば、以下は期待通りの働きをしてくれます。

names(mylist$b[[1]]) <- letters[1:10]


しかし、間違っている可能性もある。以下はその例です。

> right <- wrong <- c(a=1, b=2)
> names(wrong[1]) <- 'changed'
> wrong
a b
1 2
> names(right)[1] <- 'changed'
> right
changed b
      1 2


間違いは、名前を変えてから捨てたことです。ですから、この愚かな例で最初の2つの名前を変更するためには、次のようにします。

names(mylist$b[[1]])[1:2] <- LETTERS[1:2]


8.2.35 A 混乱

> class(dfxy)
[1] "data.frame"
> length(dfxy)
[1] 8
> length(as.matrix(dfxy))
[1] 120


これは何なのか

nrow(dfxy)


8.2.36 もう一つの混乱

以下が有効なコマンドである場合。

weirdFun()()()


何を返すのでしょうか?
例を書いてください。

8.2.37 データフレームとマトリックス (I)

行列とデータフレームは、印刷すると同じように見えます。それはいいことです。コンセプトがとても似ているからです。しかし、その実装は実にさまざまです。コンセプトが似ていて、実装が異なるオブジェクトはトラブルの元です。

> x %*% y
Error in x %*% y : requires numeric matrix/vector arguments


問題は x は行列のように見えますが、実際はデータフレームです。ひとつの解決策として as.matrix または data.matrix .

データフレームの実装の詳細は、理論的にはユーザーを困らせるものではないはずです。理論には往々にして荒削りな部分があるものです。

8.2.38 apply データフレームには適用されません

データボックスにラフエッジが適用される apply 関数を使用します。 また apply というのも、演算を行う際にデータフレームを強制的に行列に変換してしまうため、関数が期待通りに動かないことがよくあるからです。

apply(myDataFrame, 2, class) # not right


データフレームは実際にはリストとして実装され、リストの各要素はデータフレームのカラムとなります。このように

lapply(myDataFrame, class)


思い通りに動くようになります。

8.2.39 データフレームとマトリックス (II)

このコマンドを考えてみましょう。

array(sample(x), dim(x))


これにより、行列の要素の並びが変わります。もし x がデータフレームである場合、このコマンドは実行されますが、ほとんど何も得ることができません。

このようにデータボックスの列を取得することができます。

x$B


これを行列で試すと、次のようなエラーが発生します。

Error in x$B : $ operator is invalid for atomic vectors


x がデータフレームや行列である場合は、以下のようにするとよいでしょう。

x[, 'B'] 


一方、行列である可能性を排除したい場合は '$' の方がよいでしょう。

データフレームでこれを実行すると、対応するマトリックスで実行するよりも遅くなります。リアルタイムな状況では、データフレームを行列に変換した方が4倍速いでしょう。

シンプルであればあるほどいい。

8.2.40 データフレームとマトリックスの名前

データボックスの名前は、対応するマトリックスの名前とは異なります。データボックスの名前は列の名前であり,行列の名前は個々の要素の名前です.

一貫性のある名称は

  • ローンネーム
  • 色名
  • ディムネーム