この記事について
データ分析の学校に通っている中で、R言語でよく使う(けどよく忘れる)処理をメモっておきます。
自分自身の逆引き辞典として使えるように。
R言語おぼえがき
インストール関連
バージョンを指定しないでインストール
install.packages("Library_Name")
バージョンを指定してインストール
remotes::install_version("Library_Name", version = "x.x.x")
パッケージの存在チェックをした上でインストール
if(!require(Library_Name)){install.packages("Library_Name")}
ベクトル
特定の範囲のベクトルを作る
2:5 #2から5までの整数が入ったベクトル
パターン・組み合わせ
1〜5が入った箱が2つあり、1つずつ出したときのパターン
expand.grid(1:5,1:5)
1〜5の中から2つの数字を取り出したときの組み合わせ
t(combn(1:5,3))
データフレーム関連
データフレームを作る - data.frame()
df <- data.frame(列名1=vector1, 列名2=vector2)
データフレーム - 表示
列名の一覧を表示する
colnames(df)
項目の一覧と代表的な値を表示する
glimpse(df)
データフレームのサイズ(行数と列数)を確認する
dim(df)
結果は行数、列数の順に表示される。
10 20
と表示されたら、そのデータは10行20列。
カテゴリカルな値の一覧を表示する
levels(df$column_name)
文字列型の項目の一覧とカウントを表示する
table(df$column_name)
データフレーム - 列の操作
特定の列を取り出す
# iris から 1 列目を取り出す
iris[, 1]
# iris から Sepal.Length を取り出す(どっちのやりかたでもOK)
iris[, "Sepal.Length"]
iris$Sepal.Length
#複数列を名前で取り出したいなら
iris[, c("Sepal.Length", "Petal.Length")]
1列だけ取り出した場合、該当の列の値がすべて入った ベクトル を返す
-> データフレームじゃなくなるよ!
-> データフレームのままにしたい場合は、drop=Fを指定する必要あり
iris[,1,drop=F]
複数列を取り出した場合は、データフレームのまま。
特定の列を除外する
# 1列消す
df$消したい列 <- NULL
# 複数列ある場合
iris[, !(names(iris) %in% c("Species","Sepal.Length"))]
列の追加
# 初期化するなら
df$存在しない列名(追加したい列名) <- NA
# 入れたい値が既にあり、それが df と同じ長さのベクトルに入っている場合
df$存在しない列名(追加したい列名) <- dfの行数と同じ長さのベクトル
存在する列名にNULLを代入すると列がまるごと消えるので注意
列名の一括変更(正規表現)
# x というデータフレームの列名のスペースをアンスコに変更
colnames(x) <- gsub(" ", "_", colnames(x))
# x というデータフレームの列名のドットを除外
colnames(x) <- gsub("\\.", "", colnames(x))
第一引数は正規表現なので、.などはエスケープする必要あり
merge = ふたつのデータフレームの JOIN
SQLなら確実にJOINで処理するであろうあの操作を、Rでは merge という関数を使って処理します。
merged <- merge(df1, df2, by.x="df1のキーとなる列名", by.y="df2のキーとなる列名"
データフレーム - 行の操作
特定の行を取り出す(インデックス指定)
# iris の 1行目を取り出す
iris[1,]
値が1行分入った データフレーム を返す
特定の行を除外する(インデックス指定)
# iris の 1行目を除外する
iris[-1,]
行を条件でフィルタリング
#df の中に point という列があり、その列の値が80以上のデータをフィルタリングしたい場合
df[df$point > 80,]
#複数条件での抽出
df[df$point < 20 & df$attended == TRUE,]
#Genre列が特定の値の行だけを抽出
df_g <- df[df$Genre %in% c("action","adventure","animation","comedy","drama"), ]
欠損を含む行を抽出
df[!complete.cases(df), ]
欠損を含まない行を抽出
df[complete.cases(df), ]
正規表現で抽出
# 前提:stats というデータフレームの Country.Name 列に国名が入っている
# Ja で始まる行を抽出 -> Jamaica と Japan が出てくる
stats[grep("^Ja",stats$Country.Name),]
# guay で終わる行を抽出 -> Paraguay と Uruguay が出てくる
stats[grep("guay$",stats$Country.Name),]
複数行を名前指定で抽出
# 前提:stats というデータフレームの Country.Name 列に国名が入っている
stats[stats$Country.Name %in% c("Uruguay", "Paraguay"),]
ソートする
# decreasing=TRUE で降順に
iris[order(iris$Sepal.Length,Sepal.Width,decreasing=TRUE),]
行方向に結合 - rbidn
# decreasing=TRUE で降順に
wine <- rbind(wine_red, wine_white)
データフレーム - 集計
# %>% を使うために必要なライブラリ
library(dplyr)
# CountyNameごとのLifeExpの平均を集計し、新たに df_avr に入れる
df_avr <- df %>%
group_by(CountryName) %>%
summarize(AvgLifeExp = mean(LifeExp))
データフレーム - 型の操作
ファクター化
全項目をfactorに
df <- df %>%
mutate_all(as.factor)
特定の項目をfactorに
df <- df %>%
mutate(
year = as.factor(year),
month = as.factor(month)
)
データフレームの文字列型を factor 型に一括変換
df <- df %>%
mutate(across(where(is.character), as.factor))
df は、別名の df に代入しても、同じ df を上書きしてもOK
現在は以上です
新しいことを学んだら、またこちらに書き足していきます。