R !!!R.tips Rを使う時のちょっとしたこと {{outline}} !!作業の開始 一連の手順 +データを読み込んで <> +読み込んだデータを確認する ++中身を少し見てみる <> ++全体の規模を見てみる <> ++どのタイプのデータ形式になっているか <> {{pre #クリップボードからデータの貼り付け cn <- read.table("clipboard", header=T) > head(cn) ID year file 1 1 2 1 2 2 2 1 3 3 2 1 4 4 2 1 5 5 2 1 6 6 2 1 > dim(cn) [1] 2408 9 > class(cn) [1] "data.frame" }} !!作業の中断と継続(RStudioを使わない場合) !作業をしているプロジェクトごとにファイルを保存しておく 終わる前に保存するファイル(パソコン内のプロジェクトのフォルダー内に日付などをつけて保存する) +「ファイル」から「作業スペースの保存」 +「ファイル」から「履歴の保存」 +「ファイル」から「ファイルを保存」 +Rとは別に、エディターなどで作業記録を保存しておくファイルも保存 作業の再開時に(パソコン内のプロジェクトのフォルダー内から選んで開く) +「ファイル」から「作業スペースの読み込み」 +「ファイル」から「履歴の読み込み」 +エディターなどで作業記録を保存しておいたファイルも開く パソコン内のプロジェクトのフォルダー +Rを起動しておいて、そのコンソールに、そのフォルダー内の「.RData」をDrag&Dropすればよい。 +その後、そのパスの情報を使って、setwd()で、フォルダー内に作業ディレクトリを変更する。 +その後、「履歴の読み込み」をする。 作業記録のファイルに実施した命令や出力結果を、自分のメモとともに、コピペしていく。 !!テキスト処理の前処理 *アポストロフィーの記号「'」:目的に合わせて方針を決めて処理する。記号類に含めてしまうのも手。 **縮約形 **所有格 **引用符 *記号類の削除 x <- gsub("[[:punct:]]", " ", x) *重複するスペースやタブ(whitespace)をスペース一つに x <- gsub("[[:space:]]+", " ", x) **行頭のスペースの削除 x <- gsub("^ ", "", x) **行末のスペースの削除 x <- gsub(" $", "", x) *全部小文字に x <- tolower(x) !!どんな命令(関数)なのか、どんなオプションがあるのか確認 <> help(sort) sortのオプションがわかる !!R Graphical Manual https://www.imsbio.co.jp/RGM/R_image_list?page=646&init=true !!tips !Rのアップデート install.packages("installr", dependencies = T) library(installr) installr::updateR() *installrパッケージがインストールしてあれば、実行するのは最後の一行だけ !Rのバージョンの確認 version *()なし。 !使用パッケージの一覧出力 sessioninfo !使用パッケージの引用情報の出力 citation() !ライブラリーのパスの表示 .libPaths() !Rtoolsのインストール *パッケージをバイナリーではなくソースコードをコンパイルしてインストールしなければならない場合にこれがいる。gccとかのコンパイラーなどが含まれている。 https://k-metrics.github.io/cabinet/env_install_tls.html *Rtoolsをインストールしたらパスを通す 「Documents」フォルダー内に「.Renviron」というファイルを作り以下を記入 PATH="${RTOOLS40_HOME}\usr\bin;${PATH}" *インストールできたか、以下のコマンドで確認 Sys.which("make") !データの種類 **numeric (数値) **character(文字列) **factor (因子) カテゴリー変数の「水準(level)」 **logical (論理値) !データの型(構造) <> **ベクトル:一次元・一種類の要素の連なり ***<> **行列  :二次元・一種類の要素の連なり ***<> **配列  :多次元・一種類の要素の連なり ***<> **リスト :二次元の要素の連なり。違う種類も可。 ***<> **データフレーム:二次元の要素の連なり。違う種類も可。 ***<> !データの次元 <> {{pre > dim(fragNSnozeroMW) [1] 32 2 }} *32行・2列 とわかる。 !データの概要を見る *head() {{pre > head(onomato.data) subj cond timing score 1 1 exp pre 65 2 2 exp pre 75 3 3 exp pre 35 4 4 exp pre 70 5 5 exp pre 85 6 6 exp pre 55 }} *summary() {{pre > summary(onomato.data) subj cond timing score Min. : 1.00 cont:60 delay:40 Min. : 10.00 1st Qu.: 5.75 exp :60 post :40 1st Qu.: 65.00 Median :10.50 pre :40 Median : 72.50 Mean :10.50 Mean : 71.71 3rd Qu.:15.25 3rd Qu.: 85.00 Max. :20.00 Max. :100.00 }} *psychパッケージ内の **describe() {{pre > describe(onomato.data) vars n mean sd median trimmed mad min max range skew kurtosis se subj 1 120 10.50 5.79 10.5 10.50 7.41 1 20 19 0.0 -1.24 0.53 cond* 2 120 1.50 0.50 1.5 1.50 0.74 1 2 1 0.0 -2.02 0.05 timing* 3 120 2.00 0.82 2.0 2.00 1.48 1 3 2 0.0 -1.52 0.07 score 4 120 71.71 18.93 72.5 73.75 18.53 10 100 90 -1.1 1.46 1.73 }} *str() {{pre > str(onomato.data) 'data.frame': 120 obs. of 4 variables: $ subj : int 1 2 3 4 5 6 7 8 9 10 ... $ cond : Factor w/ 2 levels "cont","exp": 2 2 2 2 2 2 2 2 2 2 ... $ timing: Factor w/ 3 levels "delay","post",..: 3 3 3 3 3 3 3 3 3 3 ... $ score : int 65 75 35 70 85 55 85 20 50 55 ... }} !データフレームの操作例 *あるデータフレームの中の特定の列と特定の列だけを取り出して、新しいデータフレームを作る。 +data.frame() +colnames() +特定の列と特定の列の計算結果を新たな列にして追加 ++単に列と列を使った式を書いて、新たな列名をしてすれば自動的に新たな列名で結果が追加される {{ref_text dataframe.txt}} *欠損値を見つける関数 <> *欠損値を除く関数 <> *データ中の特定の行を外すには、行の要素番号にマイナス記号をつける。 data[-56,] **複数ある場合は、 data[c(-56,-159)] *要素に重複がある場合に重複をなくす。<> **事前にソートしておかなくてもよい点に注意 !二つのデータセットの差異 <>, <> *データフレーム内のカラムは、as.vector() で<<ベクトルに変換しておくこと>> tmp5 <- as.vector(tmp3$name) *共通部分 <> **ただし、共通する要素自体が重複する場合は一つしか表示されないので注意 intersect(x, y) *相違部分 <> **どっちを前にするかで結果が違うので注意 setdiff(x, y) ***xにだけあるもの setdiff(y, x) ***yにだけあるもの !既存のスクリプトの読み込み <> !データを読み込んだ時の「Read ... items」の表示を出ないようにする。scan( , <>) !現在の作業ディレクトリーはどこか: <> !作業ディレクトリーの変更:<> *「行き先」は現在の作業ディレクトリーからみた相対的な位置(フォルダー名など) **一つ上に行くには、<> と、ドット二つ *横のディレクトリーに移る(例えば、今、Aというフォルダーにいて、隣のBに移る)には、 **いったん、上に行って、その下のディレクトリーを指定するか、 **<> と、..で上に行った後、その下のディレクトリーを続けて指定すればよい。 *いずれにせよ、ディレクトリーを移動したら、 **今いるディレクトリーの確認 <> と **そこにあるファイルの一覧の確認 <> をすること。 *Windowsの場合、目的とするフォルダーが深いと、そこまで入力するのが面倒。 **フォルダーを開いていって、そのディレクトリー表示部分をコピペすると便利。 ***ただし、ディレクトリーを示す\にもう一つ\を足してエスケープする必要あり。 setwd("C:\\Users\\Public\\Documents\\sun") **もしくは、<> としてGUIで選択する。 !特定のディレクトリーを最初から作業ディレクトリーにするには *Rにはその設定がない。 *作業をしてできた「.Rdata」というファイルを、作業したいフォルダー内にコピーしておいて、それを、ダブルクリックでRを起動するのも手 !ファイルを読み込む:デフォルトの設定以外はオプションで変更 *スペース区切り、見出しなし <> **見出し付の場合は、オプションを付ける:データフレーム名 <- read.table("ファイル名", header = T) *カンマ区切り、見出しあり <> *タブ区切り、見出しあり <> *オプション <>を付けないとFactor型になってしまうことがあるので注意。 !データフレームをファイルへ出力する(データのバックアップのため、時々、保存したほうがよい) csvファイルでも、テキストファイルでもよい {{pre > write.csv(errdat6, "errdat6.csv") > write.table(errdat6, "errdat6.txt") }} !型の確認 <> *Factor型になってしまったものを文字列に変換する関数<>(例:wordlist) wordlist <- as.charactor(wordlist) !Excelのファイルを読み込む {{pre install.packages("openxlsx") library(openxlsx) read.xlsx("ファイル名.xlsx") }} *特定のシートは sheet="シート名" オプションを付ける !Excelのファイルに書き出す {{pre install.packages("openxlsx") library(openxlsx) write.xlsx(データ, "ファイル名.xlsx") }} !クリップボードのデータを読み込む *Windows:データフレーム名 <- read.table("clipboard") **見出しをつけて読み込むには、header=T オプションをつける * read.delim("clipboard") を使えば、デフォルトで header=T になっている。 *MacOS:データフレーム名 <- read.table(pipe("pbpaste")) *Rでのデータの形式は、被験者(A, B, C)を縦一列に並べて、その右に各種データを並べていく形が基本 ,ID,Listening,Grammar,Reading ,A,35,49,45 ,B,39,33,34 ,C,44,43,42 *これで、リスニングデータだけを処理対象にしたい場合は、データフレーム名$Listening で、35, 39, 44 という数字が使える。 *リスニングの平均を出すには: <>(データフレーム名$Listening) *数値のプロット:<> ++> plot(mwu) ++> lines(smooth.spline(mwu)) **と続けると線が上書きされる !データフレーム <- read.table("clipboard")で読み込んだデータを、ベクトルにする: x <- c(データフレーム) !データをちょっとイジリタイ場合:<>(データ) !データフレームに入っているデータのうち、特定の変数のデータのみを処理対象にしたい場合: **データフレーム名$変数名 **変数名がついていない場合 ***データフレーム名[,列番号] !いちいち「データフレーム名$」を書くのが面倒な場合、 **<> としておくと、それ以降は、 **「データフレーム名$」を書かずに、変数名だけで処理できる。 **そのデータフレームを使うのをやめて次の作業に移る場合は、 **detach(データフレーム名) をして解除しておく。 !「見出し」をつける colnames(x) <- c("one", "two") names(x) <- c("one", "two") !「見出し」の変更 * 4番目の見出しをTimeに変更 * 6番目をCorrectに colnames(kdata)[4] <- "Time" colnames(kdata)[6] <- "Correct" ! 見出しの一部だけ変更したい場合:見出しの「要素番号」を指定して上書きする names(データフレーム)[番号] <- "新しい名前" {{pre > names(vacs2) [1] "verb" "BCCWJ" "YNU_J_freq" "YNU_C_H_freq" "YNU_C_M_freq" "YNU_C_L_freq" "YNU_C_freq" > names(vacs2)[2] <- "BCCWJ_freq" > names(vacs2) [1] "verb" "BCCWJ_freq" "YNU_J_freq" "YNU_C_H_freq" "YNU_C_M_freq" "YNU_C_L_freq" "YNU_C_freq" }} !行列の入れかえ:t() {{pre > org <- read.table("clipboard") > org V1 V2 V3 1 1a 1b 1c 2 2a 2b 2c 3 3a 3b 3c > t(org) [,1] [,2] [,3] V1 "1a" "2a" "3a" V2 "1b" "2b" "3b" V3 "1c" "2c" "3c" }} !コンソールからの入力の際のメタキャラクターのエスケープは、バックスラッシュを二重にする \\ !正規表現 *Rでも基本的な正規表現は使用できる。 **注意点 ***エスケープは、\\ *Perlの正規表現を使いたい時は、perl = TRUE オプションをつける **参考リンク ***http://www.okadajp.org/RWiki/?R%20%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE ***https://stats.biopapyrus.jp/r/devel/regex.html !数の発生 *ある数(x)から、ある数(y)まで、ある数(z)ずつ増える数字を並べる。 seq(x, y, by = z) {{pre > seq(1, 20, by=1) [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 > seq(1, 20, by=2) [1] 1 3 5 7 9 11 13 15 17 19 > seq(1, 20, by=3) [1] 1 4 7 10 13 16 19 > seq(1, 20, by=4) [1] 1 5 9 13 17 }} *ある配列(a)の要素数だけ数字を並べる seq(1, length(a), by=1) *データフレームの行数の場合 seq(1, nrow(a), by=1) !組み込みデータ * state.name ! %in% *前のものが、後ろのものに入っているかどうかチェック {{pre > wordsA <- c("I", "my", "me", "mine") > wordsB <- c("you", "your", "you", "yours") > wordsC <- c("you", "I") > wordsC %in% wordsA [1] FALSE TRUE > wordsC %in% wordsB [1] TRUE FALSE }} *該当するものだけを見る {{pre > result <- wordsC %in% wordsB > result [1] TRUE FALSE > wordsC[result] [1] "you" > wordsC[wordsC %in% wordsB] [1] "you" }} !関数の定義と返り値 *reference http://cse.naro.affrc.go.jp/takezawa/r-tips/r/31.html !空のベクトルを作っておく: x <- c() * x <- 0 だと、数値0が最初に入ってしまう。 ** 値を置き換えていく場合はそれでよいけれど ** 要素を付け足していく場合、最初の要素が 0 になってしまう。 !!ファイル操作 !ファイルの一覧表示 list.files() !ファイルの情報の取得 file.info() !ファイルのコピー file.copy("元のファイル", "新しいファイル") !フォルダーの作成 dir.create("フォルダー名") !ファイルの編集 file.edit("ファイル名") !ファイルへの出力のいろいろ http://www.okadajp.org/RWiki/?R%E5%87%BA%E5%8A%9B%E3%81%AE%E8%A8%98%E9%8C%B2#na4ea430 !!Macでのこと *GUIでファイルを読み込むには **× choose.files() **○ <> *セパレーターの指定で改行は「\n」だが、 **× そのまま \n **○ オプションを押して\n ***半角の\とバックスラッシュが区別されている! ***オプションを押しながら\を押してからnを押す ***★これは、\nだけでなく、正規表現として\を使う場合は常に。 !!References https://www.delftstack.com/ja/howto/r/