このページについて

概要:このページでは、「かなり基本的なコマンドなので、特にマニュアルにも載らないが、知っているといろいろ便利な小技を集める」ということをスローガンとします。

親ページ:このページの親ページはRです。

目次

有用な目立たない関数

行列からNAを取り除く


数値(整数4桁、小数3桁)からなるデータフレーム、またはマトリックス中にデータが無いことを示す「NA」が行中、または列中の特定箇所に含まれてしまっている様な場合、その「NA」を含む、行、列を除き、「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における色の名前"も参照。

グラフィック関連

グラフィック一般

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

参考書籍

リンク

特になし


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-10-27 (日) 17:29:42