概要:このページでは、「かなり基本的なコマンドなので、特にマニュアルにも載らないが、知っているといろいろ便利な小技を集める」ということをスローガンとします。 親ページ:このページの親ページはRです。
有用な目立たない関数 †行列からNAを取り除く †
> # 例を作る > x <- matrix(1:30, 5, 6) > x[1,2] <- x[3,4] <- x[4, 6] <- NA > x [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 NA 11 16 21 26 [2,] 2 7 12 17 22 27 [3,] 3 8 13 NA 23 28 [4,] 4 9 14 19 24 NA [5,] 5 10 15 20 25 30 > # 適用 わずかにこれだけ > y <- x[!is.na(rowSums(x)), !is.na(colSums(x))] > y [,1] [,2] [,3] [1,] 2 12 22 [2,] 5 15 25
> x[complete.cases(x),complete.cases(t(x))] [,1] [,2] [,3] [1,] 2 12 22 [2,] 5 15 25 後者の方が効率がよいらしい. > x <- matrix(1:30, 5, 6) > x[1,2] <- x[3,4] <- x[4, 6] <- NA > system.time(for(i in 1:100000) y <- x[!is.na(rowSums(x)), !is.na(colSums(x))]) user system total user.children system.children 24.156 0.480 27.397 0.000 0.000 > system.time(for(i in 1:100000) z <- x[complete.cases(x),complete.cases(t(x))]) user system total user.children system.children 4.914 0.087 5.540 0.000 0.000 行列のサイズにも依存する? > x <- matrix(rnorm(1000000), 1000, 1000) > x[sample(1000,50),sample(1000,50)] <- NA > system.time(for(i in 1:100) y <- x[!is.na(rowSums(x)), !is.na(colSums(x))]) user system total user.children system.children 27.518 2.444 32.602 0.000 0.000 > system.time(for(i in 1:100) z <- x[complete.cases(x),complete.cases(t(x))]) user system total user.children system.children 25.149 4.482 32.726 0.000 0.000 dataハンドリングをすべてRの中で行う(エクセルに頼らない) †edit.data.frame package:utils data.entry package:utils
fix package:utils http://finzi.psych.upenn.edu/R/doc/manual/R-data.htmlを参考に。 {Rcmdr} が関連するようである。例えば、 showData() とか。 write.table() edit() とか。ここら辺はヘルプでもみましょう。 write.matrix() {MASS} も有用っぽい. 参考:
lsという関数が有用 †>ls() とやると、自分がどんなオブジェクトを定義したか、一覧が見られます。lsはListの略です。 rmという関数が有用 †>rm() とやると、自分が定義したオブジェクトを消すことが出来ます。rmはRemoveの略です。 すべてのオブジェクトを消去する方法 †RGui→"その他"→"すべてのオブジェクトの消去" 混乱しないためには、新しい作業スペースを使うほうがいいかもしれませんが。 Iという関数が有用 †lm(x~y) lm(x~y^2) の二つは、同じ結果を返す。 lm(x~I(y^2)) とやると、ちゃんと二乗したものを説明変数とみなしてくれる。 search()が有用. †現時点でインストールされており,かつ,読み込まれているパッケージの一覧. search() namesという関数が有用。 †Rを使って計量経済分析の例でいうと、 > summary(lm(I ~ Y + r1))->fit > names(fit) とやれば [1] "call" "terms" "residuals" "coefficients" "aliased" "sigma" [7] "df" "r.squared" "adj.r.squared" "fstatistic" "cov.unscaled" attr() attributes() structure() なども参照. strという関数が有用。 †
Rを使って計量経済分析の例でいうと、 > summary(lm(I ~ Y + r1))->fit > str(fit) とやると List of 11 $ call : language lm(formula = I ~ Y + r1) $ terms :Classes 'terms', 'formula' length 3 I ~ Y + r1 .. ..- attr(*, "variables")= language list(I, Y, r1) .. ..- attr(*, "factors")= int [1:3, 1:2] 0 1 0 0 0 1 .. .. ..- attr(*, "dimnames")=List of 2 .. .. .. ..$ : chr [1:3] "I" "Y" "r1" .. .. .. ..$ : chr [1:2] "Y" "r1" .. ..- attr(*, "term.labels")= chr [1:2] "Y" "r1" .. ..- attr(*, "order")= int [1:2] 1 1 .. ..- attr(*, "intercept")= int 1 .. ..- attr(*, "response")= int 1 .. ..- attr(*, ".Environment")=length 8 <environment> .. ..- attr(*, "predvars")= language list(I, Y, r1) .. ..- attr(*, "dataClasses")= Named chr [1:3] "numeric" "numeric" "numeric" .. .. ..- attr(*, "names")= chr [1:3] "I" "Y" "r1" $ residuals : Named num [1:105] -1.79 -6.04 -7.57 -10.49 -13.88 ... ..- attr(*, "names")= chr [1:105] "1" "2" "3" "4" ... $ coefficients : num [1:3, 1:4] 7.821 2.090 -1.535 2.519 0.244 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:3] "(Intercept)" "Y" "r1" .. ..$ : chr [1:4] "Estimate" "Std. Error" "t value" "Pr(>|t|)" $ aliased : Named logi [1:3] FALSE FALSE FALSE ..- attr(*, "names")= chr [1:3] "(Intercept)" "Y" "r1" $ sigma : num 5.65 $ df : int [1:3] 3 102 3 $ r.squared : num 0.458 $ adj.r.squared: num 0.448 $ fstatistic : Named num [1:3] 43.2 2.0 102.0 ..- attr(*, "names")= chr [1:3] "value" "numdf" "dendf" $ cov.unscaled : num [1:3, 1:3] 0.19893 -0.00458 -0.02355 -0.00458 0.00187 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:3] "(Intercept)" "Y" "r1" .. ..$ : chr [1:3] "(Intercept)" "Y" "r1" - attr(*, "class")= chr "summary.lm" summaryとかsummary.lsとかpredict.lsとか †ここを見ましょう。 methods{utils} †RjpWikiのこのページの「関数のソースコードを見る、methods(), getS3method() 関数 -- from r-help, 2005.01.18」をみよ。 たとえば、kfilter{sspir}の中身を見たい場合、 > kfilter function (ss) { UseMethod("kfilter") } <environment: namespace:sspir> としか表示されない。中身を知るために、 > methods(kfilter) とやれば [1] kfilter.SS kfilter.ssm を得る。だから、 > kfilter.SS とか > kfilter.ssm とか入力すれば関数の中身が見られる。 ところが、tsls(sem)の場合、 > tsls function (y, ...) { UseMethod("tsls") } <environment: namespace:sem> となるので、 > methods{tsls} と入力しても [1] tsls.default* tsls.formula* Non-visible functions are asterisked となって中身が隠蔽されている。 そこで、 > getS3method("tsls", "default") や > getS3method("tsls", "formula") とすればやっと中身が見られる。 ちなみに、kfilterの場合でも > getS3method("kfilter","SS") とか > getS3method("kfilter","ssm") やっても同じ結果を得られる。 system.time () {base} †
色コード †colors() グラフィック関連 †グラフィック一般 †RwpWikiの"Rのグラフィックスパラメータ "によくまとまっています。 二つの図を同じwindowの中に分割して表示 †グラフィックスパラメータ指定関数 par() を使います。 3Dプロット †persp を使えばよいです。これを使う際に注意点は、以下の例を参照。 > a<-1:10 > b<-6:20 > f<-function(x,y){x^2+y^2} > persp(a,b,outer(a,b,f),theta = 30, phi = 30, expand = 0.5,col="lightblue") > persp(a,b,outer(b,a,f),theta = 30, phi = 30, expand = 0.5,col="lightblue") 以下にエラーpersp(x, y, z, xlim, ylim, zlim, theta, phi, r, d, scale, expand, : 'z' 引数が不正です > persp(b,a,outer(b,a,f),theta = 30, phi = 30, expand = 0.5,col="lightblue") > persp(b,a,outer(a,b,f),theta = 30, phi = 30, expand = 0.5,col="lightblue") 以下にエラーpersp(x, y, z, xlim, ylim, zlim, theta, phi, r, d, scale, expand, : 'z' 引数が不正です すなわち、persp(x,y,z)で、「x:x軸のベクトル」、「y:y軸のベクトル」、「z:座標(x,y)に対応するz軸の値を格納した行列。(x×y)の行列でなければならない。」ということ。 凡例を入れる †x<-c(3,2,3,2,4,5,4,6,7,5,7,6,8,9,8,7,8,9) plot(x,type="l",main="zu",xlab="yokojiku",ylab="tatejiku") legend(locator(1),legend=c("NAME"),lty=c(1), lwd=c(1)) 例えば,上のコマンドをそのままコピペしてRで実行してみましょう.実行後,凡例を入れたい場所をマウスでクリックすれば,そこに凡例が入ります. 図をeps形式で保存 †文字化けする,という人はここを見ましょう. あるいは,ここも参照. 図をPDF形式で保存 †コマンド例を挙げておく. 例1 pdf("myfile.pdf") plot(rnorm(100)) dev.off() 例2 N<-10 i<-0:10 p<-0.6 pdf("myfile1.pdf") ypdf<-dbinom(i,N,p) Title<-"Binomial Probability distibution with n=10 and p=0.6" barplot(ypdf, xlab = "x", ylab = "P(X=x)",main=Title) dev.off() 参考:http://people.su.se/~ma/R_intro/node47.html データをcsv形式などで保存 †write.table(X,"test.csv",sep=",") などとすれば,R内でXと定義されているデータが,test.csvというファイル名で保存される."test.txt"などでも良い.sep=","とやったほうがExcelなどでの扱いが容易となる. Rで数学 †微分 †D(expression(x^2),"x") D(D(expression(x^2),"x"),"x") 整数部分を取り出す †x <- pi * c(-1:1,10) as.integer(x) Reference †参考書籍 †リンク †特になし |