niszetの日記

10年目エンジニアが最近勉強したことを忘れないようにメモをする

R言語徹底解説 3章付近。listとdata.frame

この間ハマったので…

例のmidiを読んでdata.frameにするパッケージを作っていてハマったのですが、listを連結してas.data.frameにかけるときに注意が必要…

as.data.frame(rbind(list(a=1,b=2,c=7),list(e=1,f=2,g=3)))
#   a b c
# 1 1 2 7
# 2 1 2 3

str(as.data.frame(rbind(list(a=1,b=2,c=7),list(e=1,f=2,g=3))))
# 'data.frame':    2 obs. of  3 variables:
#  $ a:List of 2
#   ..$ : num 1
#   ..$ : num 1
#  $ b:List of 2
#   ..$ : num 2
#   ..$ : num 2
#  $ c:List of 2
#   ..$ : num 7
#   ..$ : num 3

一方、

data.frame(list(a=c(1,2),b=c(2,3),c=c(3,4)))
#   a b c
# 1 1 2 3
# 2 2 3 4

str(data.frame(list(a=c(1,2),b=c(2,3),c=c(3,4))))
# 'data.frame':    2 obs. of  3 variables:
#  $ a: num  1 2
#  $ b: num  2 3
#  $ c: num  3 4

なので、表示されるときはいい感じに解釈されているものの、中の構造が違うという話でした。

例のパッケージではリストを次々と足していく形でdata.frameにするわけですが、複数のlistをrbindしてからas.data.frameにしたがために列があっていないと言われ…
気を付けましょう…。

(R) R言語徹底解説 3章 手を動かす編2

一旦3章に戻る。

3.2.3の、演算子[と[[によるアトミックベクトルとリストへの結果の違いについての表の結果が気になったので書いておく。

行列は3.2.3の表とは関係ないですが、自分の知識の補強として。

maxtrixはベクトルにdimの属性がついただけなので、

x <- matrix(1:9, nrow=3)
x
#      [,1] [,2] [,3]
# [1,]    1    4    7
# [2,]    2    5    8
# [3,]    3    6    9

x[1]
# [1] 1

のようにアクセスするとmatrixの左上から下方向に順にアクセスできる。 そのため、byrow=Tを指定すればこんな感じ。

x <- matrix(1:9, nrow=3,byrow = T)
x
#      [,1] [,2] [,3]
# [1,]    1    2    3
# [2,]    4    5    6
# [3,]    7    8    9
x[2]
# [1] 4

同じインデックスでも返ってくる値は異なる(当たり前だが)

x <- matrix(1:9, nrow=3,byrow = F)
x[2]
# [1] 2

このとき、範囲外の値を与えるとNAが返ってくる

x[10]
# [1] NA

ベクトルなので、logicalを与えるとリサイクル規則で展開される。NAはlogicalなので

x[NA]
# [1] NA NA NA NA NA NA NA NA NA

当然、TRUEなら全要素

x[T]
# [1] 1 2 3 4 5 6 7 8 9

逆にFALSEだと

x[F]
# integer(0)

となる。一致する要素がないため。これは、NULLを与えたときと返ってくる値は同じ。

x[NULL]
# integer(0)

NA_real_で与えてあげれば、当然1要素だけとなる。logicalではないので。

x[NA_real_]
# [1] NA

ちょっとこの辺りの値は書いてある結果と違う気がしますね。誤植かも。
[[のほうは同じで全部エラーとなります。

listの場合、

(y <- list(a=1, b=2, c=3))
# 
# $a
# [1] 1
# 
# $b
# [1] 2
# 
# $c
# [1] 3

として、

y[NA]
# $<NA>
# NULL
# 
# $<NA>
# NULL
# 
# $<NA>
# NULL

y[NA_real_]
# $<NA>
# NULL

y[NULL]
# named list()

y[[NA]]
# NULL
y[[NA_real_]]
# NULL

こんな結果に。エラーについては同じ結果でした。

まぁ、これを積極的に使うことはないと思いますが、変な結果が出たときに何が原因かピンと来るためには変な値を与えた結果を見ておくと良いのです(たぶん)

そんな感じで今回はここまで。

listをas.data.frameにしたときの挙動がちょっと不思議だったので宿題としてそれが残っていますが、6章も進めていきます…。

Enjoy!!

(R) R言語徹底解説 6章

3章に宿題を残したまま…

一旦、6章へ(4,5章はエクササイズなし)

6.1.2 の 2

解答は、以前の記事のリンクを参照。特にbookdownのものはとても良いです。

さて、primitiveではなくNULLを返す関数は具体的にどれだろう?ということで

tmp <- funs[sapply(funs, function(x) is.null(formals(x)) & !is.primitive(x))]

names(tmp)
#  [1] "closeAllConnections"      "contributors"            
#  [3] "Cstack_info"              "date"                    
#  [5] "default.stringsAsFactors" "extSoftVersion"          
#  [7] "getAllConnections"        "geterrmessage"           
#  [9] "getLoadedDLLs"            "getRversion"             
# [11] "getTaskCallbackNames"     "getwd"                   
# [13] "iconvlist"                "is.R"                    
# [15] "l10n_info"                "La_library"              
# [17] "La_version"               "libcurlVersion"          
# [19] "licence"                  "license"                 
# [21] "loadedNamespaces"         "loadingNamespaceInfo"    
# [23] "memory.profile"           "OlsonNames"              
# [25] "pcre_config"              "R.Version"               
# [27] "search"                   "searchpaths"             
# [29] "stderr"                   "stdin"                   
# [31] "stdout"                   "sys.calls"               
# [33] "Sys.Date"                 "sys.frames"              
# [35] "Sys.getpid"               "Sys.info"                
# [37] "Sys.localeconv"           "sys.nframe"              
# [39] "sys.on.exit"              "sys.parents"             
# [41] "sys.status"               "Sys.time"                
# [43] "tempdir"                 

となりました。内部で.Internalを呼んでいるものが多いですが、それに限らないようです。

これらの関数の中身を見るのであれば、

lapply(tmp, body)

ですね(6章本文の通り。lapplyは6章より後の話だけど…)

エクササイズ難しい~

ということで。

Enjoy!!

(R) R言語徹底解説 3章 手を動かす編1

引き続き。

2章の書き残し。

str, class, typeof, is., attributes の関数は覚えておくと良い。データに詳しくなれる。 代入の式、(<-) はその式を()で囲うと値が表示される。これに限らず、invisibleになっている関数の返却値は()で囲えば見れるようになるのでこれも覚えておくと良い。

3章。

データの抽出。

(x <- c(2.1, 4.2, 3.3, 5.4))
# [1] 2.1 4.2 3.3 5.4

整数を与えるとその番号の要素が得られる(Rは1からはじまる)が、NAを入れるとNAが返ってくる。

x[c(1,NA)]
# [1] 2.1  NA

これは書かれてなかったが、NAだけを与えると、全要素NAになって返ってくる。

x[c(NA)]
# [1] NA NA NA NA

これはNAがlogicalであることからきているのですが、これについて調べていて自分の理解が間違っていたことに気づいたので書いておく。 とりあえず。

(x <- c(1,2,3,4,5)) # ()で囲うと代入した値が表示される
# [1] 1 2 3 4 5

要素を抜き出すとき、

x[c(1,2)]
# [1] 1 2

というように、indexを指定する形で値を抜き出すことができますね。 T(TRUE)/F(FALSE)でも対応する要素を抜き出せますが、例えば下記のようにすると

x[c(T,F)]
# [1] 1 3 5

これはx[c(T,F,T,F,T)]の結果ですね。logicalの場合はリサイクル規則は相手の要素数を超えない範囲で繰り返されるのか…

NAだけの場合はlogicalで与えているのでリサイクルされて全要素がNAになる。他の数字といると型変換でNA_realかNA_integerに変換(前の例ではNA_real_になる。数字は1Lのように明示的にLをつけないとintegerとならない。typeof(1)typeof(1L)などで確認できる。

ちなみに、範囲外ならNA

x[6]
# [1] NA

となる。

この挙動はlistやdata.frameでも異なるので注意が必要だ…。

全然3章の中身に触れられていませんが、とりあえずここらで一度区切り。

Endoy!!

(R) R4DSの和訳本が出る…

英語が苦手な方も、ついに…

月曜の時点ではオライリージャパンにページが見つからなかったのですが、下記のページが公開されており、いよいよ出るようです。

www.oreilly.co.jp

amazonではしばらく前から予約できるようになっていて、ついに…と思っていましたが、表紙も表示されてない状態なのに半信半疑だったので(何故)

英語版はここで読む、

r4ds.had.co.nz

か、オライリーとかamazonで購入できます。 私は去年これを注文したものの、konozama食らって到着は年明けだった気がします。そこから約2.5か月かけて出勤中に読みました。エクササイズはggplot2だけ少しやったもののほとんどやれていませんが(例によってエクササイズは難しいですね) 徹底解説の方がある程度出来たらこちらもやっていきたい。

エクササイズの解答は、英語ならインターネット上にありますね。内容は未確認ですが…。

jrnold.github.io

読むべし…

オライリーの和訳は基本的には原著の出版時のまま和訳されていた気がしますので、おそらく最新の更新分などは自分で追いかける必要があります。 ただ、マニアックな関数はあまり使われていなかったと思います。わからないことがあればwakalangで聞くと良いと思います。

tidyverseパッケージに含まれるパッケージのほとんどに加え、Rmarkdownのことも書いてあってとても良いです。

英語版持っているけど、社内の布教のためにも買おうかなぁ…

自分がR4DSを読んだのはR歴4か月ほどのときからなので、ある程度の初心者でもなんとかなると思いますし、得るものは多いと思います。 ただ、初歩の初歩、ベクトルだリストだデータフレームだ、については理解していて、ある程度関数を使ったことがあって…という下地は必要です。(1章がggplot2であることからお察しください) 統計の知識はほとんど要求されませんが、glmとかの関数を使ったことがあった方がmodelの章は理解が深まるかな…

ということで、

Enjoy!

(R) R言語徹底解説 2章など

2章だけでも結構学びがあります…。

matrix, array

matrixとarrayをあまり使ってなかったので触ってみる。

matrixは行列、arrayは配列と訳されていますね。そして、matrixは次元が2のarrayなので(そうだったのか…)

identical(array(1:6, c(2,3)), matrix(1:6, ncol=3, nrow=2))
# [1] TRUE

とすると一致しますね。

ということで、matrixであればarrayであるが、逆は必ずしも成り立たない

is.array(array(1:12, c(2,3,2)))
# [1] TRUE
is.matrix(array(1:12, c(2,3,2)))
# [1] FALSE

2.3.1節のエクササイズ2はこういうことですかね。

is.vector

先の記事のリンク先に貼ってあったslackのやりとりから、attributeつきのオブジェクトに対して、is.vectorはFALSEを返すとのこと、やってみると

a <- 1:10
is.vector(a)
# [1] TRUE

はい。まぁこれは良しとして。

names(a) <- letters[1:10]
attributes(a)
# $names
#  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
is.vector(a)
# [1] TRUE

ふむ。名前をつけても大丈夫そうです。しかし、

attr(a, "ss") <- "hhh"
a
#  a  b  c  d  e  f  g  h  i  j 
#  1  2  3  4  5  6  7  8  9 10 
attr(,"ss")
# [1] "hhh"
is.vector(a)
# [1] FALSE

おっと、FALSE。なるほど…。

しかし、

is.atomic(a)
# [1] TRUE

なので、Hadleyの書いたように

is.atomic(a) || is.list(a)
# [1] TRUE

で良いわけですね。

slackのやり取りのもう一方のexpressionについて。

is.vector(expression())
# [1] TRUE

なるほど。しかし、

is.atomic(expression()) || is.list(expression())
# [1] FALSE

となるので、expressionはベクトルに入れないの?という話になるわけですね。expressionが出てくるのはまだ先なのでとりあえずここでは触れないことに。

とりあえずここまで。少しずつやっていきましょう。

Enjoy!!

(R) R言語徹底解説を読み始めました(10/11追記)

Rを触り始めて2年目になりました。

去年の今頃には明らかにRを触り始めていたので、早くもRおじさん2年目に突入です。

先々月辺りからRの壁にぶつかっていて、これはRの基本をちゃんと理解できていないからだなと思いまして、R言語徹底解説を読んでいます。 読むだけなら14章までは目を通したのですが、結局のところ実際に手を動かして身につけていかなくては意味がなく…。エクササイズや本文中のコードや出てきた関数など、とりあえず使って挙動を見ていこうと思います。

…なのですが、これはあまりブログ向きではないですね…。 気になる挙動などは少しだけ書いていくかもしれません。まぁ自分の勉強メモなので、そこら辺は臨機応変に。

さて、R言語徹底解説は共立出版さんから出ています。 www.kyoritsu-pub.co.jp

そのもとになった、Advanced Rのオンライン版はこちらです。

Welcome · Advanced R.

洋書自体も購入可能ですが、訳が良く読みやすいので特にその必要はないかと思います。
日本語版は出版当時の環境で、原著との挙動の差異がある場合は脚注がついていますので、その点でもこちらで良いと思います。ただし、その後のバージョンアップ分による差異はサポートサイトはない?ぽいですが、u_riboさんの記事によれば

uribo.hatenablog.com

r-wakalangで質問しましょう!とのこと。キャプチャによるとexpressionの話ぽいですね。

多少の誤字脱字レベルの誤植があります。hoxo_mさんがまとめているこの記事が一番まとまっているかな。

qiita.com

ここにないものもある気がしますが、まぁ読むのに差し支えないレベルの誤字脱字は別にいいか…という気持ち。

さて、章末にはエクササイズがありますが、その解答は書籍にはないです。
これまたhoxo_mさんに英語版ならありますよと教えていただきました。ありがとうございました。

いくつか見つかりました。 貼っておきますが、内容をチェックしたわけではないので、適宜自分でも考えたり実行したりで答え合わせをするなどしてみると良いです。(というか、手を動かさないと覚えられないですしね…)

少しだけ載ってます github.com

最近も更新があったよう? github.com

こちらもまとまってます。 bookdown.org

いつ読んだらよい?

R言語徹底解説、なんだか難しそうな印象も受けるので、自分も今の今までほとんど読んでいなかったのですが、R使いは一度は読むべき本のうちの一冊、と思います。必携。

ある程度基本的な操作ができてきて、自分で少しずつRのプログラムのコードも描けるようになってきたな、というあたりで第一部は呼んでおくとよかったですね…。
特に環境/スコープ周りは理解できてないといずれ詰むので…。

4章に覚えておくと良い関数が列挙されています。おそらくこの本のどこかで使うことになるものが列挙されているので、前から読んでいってここで全部の関数の使い方を見ておこう…とはしなくて良いです。しても良いけど、必要な時にヘルプ読めば良いので。

とりあえず、当面はコレの復習(~14章まで)に時間を突っ込もうと思います。R言語徹底解説徹底解説が出来るくらいになると良いですね。がんばろ・・・

Enjoy!!

追記

twitterの方で、ぞうさんから「R言語徹底解説」を読み開くタイミングについて、記事の紹介をいただきました。

「R言語徹底解説」を読み開くタイミング | 日々是独想 - 日々の徒然なることを独り想う。

読み開くタイミングは「関数のコードに興味を持った時」

まさしく!って感じです。関数の中身を読もうとすることが増えたなぁ…というタイミングで、是非手にとってみてください!