[R][RStudio]Rの基本的なコマンド一覧

person holding white r marquee R
Photo by Meta Dizayn on Pexels.com

R言語

Rのインストール方法や便利な環境設定などは別記事で取り上げる。ここではRstudioが利用できる環境が構築されているものとする(今後必要に応じて追記していく)。

必須パッケージ

tidyなデータフレームの扱いのため、tidyverseのインストールは必須。この中にggplot2dplyrも全部含まれている。

Tidyverse
The tidyverse is an integrated collection of R packages designed to make data science fast, fluid, and fun.

インターネット接続環境で以下のコマンドを入力。

install.packages(“tidyverse”) 

インストールできたら

library(tidyverse)

でOK。

自分のいるディレクトリの確認

RのコマンドラインあるいはRStudioで、

getwd()

と入力(get working directory)。読み込むデータがある階層(フォルダ)に移動する場合、

setwd("/home/Documents/Rdata")

などというように現在地を移動させておく。これをやっておかないと、.csvなど自分の読み込みたいデータの読み込みが上手くいかない(基本的だけど忘れがち)。

.csvなどデータフレームの読み込み

df <- read.csv("/home/Documetns/Rdata/mydata.csv")

が基本。オプションとしてheaderの有無や、区切り記号などを指定する。

df <- read.csv("/home/Documetns/Rdata/mydata.csv", header = TRUE/FALSE, sep = ",")

sepの指定で例えば\(1.1, 2.2, 3.3, 4.4, \cdots\)などのように\(“,”\)で区切られたデータを一列として読み込むことができる。与えられたデータが.csvでなく表形式の場合、

df <- read.table("/home/Documetns/Rdata/mydata.csv", header = TRUE/FALSE, sep = ",")

とすると良い。

データに欠損値が含まれる場合

例えばデータの欠損値が\(.\)で埋まっていたり、\(99\)などとなっている場合、これを欠損値NAとして読み込ませる必要がある。この指定は、

df <- read.table("/home/Documetns/Rdata/mydata.csv", header = TRUE/FALSE, sep = ",", na.strings = ".")
df <- read.table("/home/Documetns/Rdata/mydata.csv", header = TRUE/FALSE, sep = ",", na.strings = "99")

などとする。

データフレームから列を選択する

列名を指定するか、列番号を指定する。

df$var #列名で指定
df[, 5] #5列目を指定

複数列の場合は

df[, 3:10]

のように指定する。ある列だけ除く場合は

df[, -6] #6列目を除く

となる。ベクトルも使える。

df[, c(2, 4, 6)] #2, 4, 6列目を抽出

データフレームから行を抽出

列とは逆で、

df[5, ] #5行目を抽出

となる。

条件を満たす列や行を抽出

条件式を用いる。

df2 <- df[df$var > 0.5, ] #変数varが0.5以上のものを抽出

最大値や最小値

単純にmax, minで良い。

max(df$var1) #var1の最大値
min(df$var2) #var2の最小値

特定の列だけのデータフレームを作る

library(tidyverse)

に加えて、

require(data.table)

が必要。こうしておいて、

df_selected <- df[, c(1, 2, 5)]
df_selected <- as.data.table(df_selected)

とすると、”df”というデータフレームの\(1, 2, 5\)列目のみを抜き出したデータフレームが作成される。

df_unselected <- df[, -c(1, 2, 5)]
df_unselected <- as.data.table(df_unselected)

とマイナスを付けると、\(1, 2, 5\)列目がないデータフレームを作成できる。

パイプラインの処理について

tidyverseをインストールしたことにより可能になったのが、パイプライン\(%>%\)を用いた処理。

df %>%
 select(sex) %>%
 head()

まず、”df”というデータフレームを指定し、それに対して、”sex”という変数を選択し、さらに”head()”で先頭の数行を表示しろ、というように人間にとって自然な流れでコマンドを作成することができる。以下ではこれを頻繁に用いる。

変数の作成

既存の変数をいじって変数を作る場合、例えば身長(m)と体重(kg)からBMIを計算する場合、以下のようにmutateを用いる。

df %>%
 mutate(BMI = weight/(height)^2)

ただし、上のようにすると”BMI”という変数が生成された瞬間に消えてしまう。新しくデータフレームを作る場合には

df2 <- df %>%
 mutate(BMI = weight/(height)^2)

とすれば、”df2″というデータフレームが作成され、その最終列に”BMI”列が追加される。わざわざデータフレームを生成せずに”df”に上書きする場合は、

df <- df %>%
 mutate(BMI = weight/(height)^2)

とすれば良い。

変数のグループ化

group_by, summarizeを用いる。縦データなどでグループごとの要約を知りたいときなどに便利。

df <- df %>%
 group_by(class) %>%
 summarize(mean = mean(math), sd = sd(math), n = n())

こうすると、classごとのmathの平均、標準偏差、クラスの人数が表示される。

変数のフィルター

filterを用いる。

df <- df %>%
 filter(sex == 1 & age < 20) %>%
 mutate(Young_man = 1)

性別が1で、年齢が20歳未満の人をフィルターして、新しく”Young_man”という変数に\(1\)を収納した。

列の名前の変更

もっと良い方法があると思うが、いつもこうやっている。

col_num <- which[names(df) == "ID"] #"ID"という名前の列の列番号を探す
names(df)[col_num] <- "new_ID" #"ID"という列の名前を"new_ID"という名前に変更。

case_when

カテゴリー変数の作成などで用いる。例えば年齢が連続変数であるとき、カテゴリー変数(5歳ごとなど)にしたい時がある。このときは、

df <- df %>%
 mutate(agecat = case_when(age < 20 ~ "Young", age >=20 & age < 59 ~ "Middle", age >= 60 ~ "Old"))

とする。複雑な条件式はエラーになることがある(または\(|\)など)。この場合は、条件式を分岐させれば良い。例えば、年齢と性別でカテゴリー分けする場合は、以下のようにする。

df <- df %>%
 mutate(agesexcat = case_when(age < 20 & sex == "Female" ~ "Young_Female",
                              age < 20 & sex == "Male" ~ "Young_Male",
                              age >= 20 & age < 59 & sex == "Female" ~ "Middle_Female", 
                              age >= 20 & age < 59 & sex == "Male" ~ "Middle_Male",
                              age >= 60 & sex == "Female" ~ "Old_Female",
                              age >= 60 & sex == "Male" ~ "Old_Male"))

case_whenでの欠損値の扱い

欠損値に何らかの値(\(0\)やMissingなど)を格納したい場合は、以下のように指定する。

df <- df %>%
 mutate(agesexcat = case_when(age == NA ~ "Missing"
                  age < 20 & sex == "Female" ~ "Young_Female",
                              age < 20 & sex == "Male" ~ "Young_Male",
                              age >= 20 & age < 59 & sex == "Female" ~ "Middle_Female", 
                              age >= 20 & age < 59 & sex == "Male" ~ "Middle_Male",
                              age >= 60 & sex == "Female" ~ "Old_Female",
                              age >= 60 & sex == "Male" ~ "Old_Male"))

NAの型は”NA_integer_”, “NA_real_”, “NA_character_”, “NA_complex”とあることに注意。

if_else

case_whenは複数、if_elseは2分岐。

df <- df %>%
 mutate(agecat = if_else(age < 60, "Young", "Old", missing = NULL))

条件が当てはまるときは前者の”Young”を、当てはまらないときは後者の”Old”が変数の値として格納される。

日本語のラベルを数値に置き換える

case_whenやif_elseを使わないときは、以下のようにする。

df["var"] <- lapply(df["var"], gsub, pattern = "なし", replacement = 0)
df["var"] <- lapply(df["var"], gsub, pattern = "あり", replacement = 1)

今は”var”という変数の”なし”を\(0\)に、”あり”を\(1\)に置き換えた。このままだと数値ではなく文字列変数なので、

df$var <- as.numeric(df$var)

と数値に変換しておくと良い。

欠損値を除去する、あるいは置き換える

置き換えるときは、

df[is.na(df$var), ]$var <- 0

で欠損値が\(0\)になる。

重複があるとき

IDなどに重複があるとき、

重複を除いたカウント

length(unique(df$ID))

でユニークな”ID”の個数をカウントできる。あるいはどれだけ重複しているのかが知りたいときは、

table(duplicated(df$ID))

とすると、

FALSE TRUE
2022  33

などと表示されてわかりやすい。最大重複回数を表示するときは、

max(table(df$ID))

とする。

重複を削除する

df <- df[!duplicated(df$ID), ]

で”ID”に重複があるものを削除できる。最後の\(,\)は重要。

重複の回数、参加回数をカウントする

これはdplyrがシンプルで美しい。

df_new <- df %>%
 group_by(ID) %>%
 mutate(number_of_participation = n())

これだと重複の個数がnumber_of_participationという新たな変数に収納される。(例えば\(3\)回参加していたらIDごとにすべて\(3\)という数字が入る)。

これとは異なり、「何回目の参加なのか」を知りたいときは、

df_new <- df %>%
 group_by(ID) %>%
 mutate(ordinal_of_participation = 1:n())

とする。こうすると例えば\(5\)回参加したIDのordinal_of_participationには順に\(1, 2, 3, 4, 5\)が収納される。これを行う前に日付などでsortしておくと良いだろう。

テーブルデータ(\(2\times 2\)表)を表示する。

table(df$var1, df$var2)

とする。欠損値も表示するときは、

table(df$var1, df$var2, exclude = NULL)

とオプションを付ける。このままカイ二乗検定Fisherの正確正確検定も行える。

chisq.test(table(df$var1, df$var2)) #欠損値を含めない
chisq.test(table(df$var1, df$var2, exclude = NULL)) #欠損値を含める
fisher.test(table(df$var1, df$var2)) #欠損値を含めない
fisher.test(table(df$var1, df$var2, exclude = NULL)) #欠損値を含める

頻度(パーセント)を表示したいときは、

prop.table(table(df$var1, df$var2, exclude = NULL), 1)*100 #行方向の割合
prop.table(table(df$var1, df$var2, exclude = NULL), 2)*100 #列方向の割合

とする。\(1, 2\)を指定しないと全体の割合が表示される。パーセントを表示したいので\(*100\)としていることに注意。

基本的な検定

例えば性別ごとに連続量(年齢など)を見たいときは、

df %>%
 group_by(sex) %>%
summarise(mean = mean(age), sd = sd(age), size = n())

とすると性別ごとの年齢の平均、標準偏差、サンプル数がわかる。検定を行うときは、

t.test(df$sex~df$age)

で良い。

データフレームの結合

left_join, inner_join, mergeがある。mergeとleft_joinは同じだと考えている。

df3 <- left_join(df1, df_2, by = "ID") #df1にdf2を左から結合
df3 <- inner_join(df1, df_2, by = "ID") #df1とdf2で共通するIDのみを結合
df3 <- merge(df1, df_2, by = "ID") #inner_joinと同じ

時系列データへの変更

文字列を日付データに変換するときは、as.Date()を用いる。defaultの書式はyyyy-mm-ddという形式なので、それ以外の場合はformatオプションで明示する必要がある。

t <- "2022-09-01"
s <- as.Date(t)

t1 <- "09/01/2022"
s1 <- as.Date(t1, format = "%m/%d%Y")

データの書き出し

write(書き出すデータ, "書き出すファイルのpath", header = TRUE/FALSE, sep = "", append = TRUE/FALSE)

appendはすでに存在するファイルの後ろに追加する場合にTRUEを指定する。

コメント

タイトルとURLをコピーしました