PythonユーザのためのRコード対応シート

Pythonの分析系コードを理解している人向けに、Rコードの対応まとめました。 ※随時更新中
（本記事では、Rのbaseパッケージのみ使用） 

「pythonで書くあれって、Rでどう書くんだっけ？」っていう流れって多いんですよね。

# ドキュメント内の命名規則

特に断りがなければ、モジュール名のエイリアスは下記の通り。

```python:python
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
```

下記に登場する変数名称のイメージ。

```python:python
df = pd.DataFrame()
```

```R:R
df = data.frame()
```

# PythonコードのRでの書き方

## データフレームの生成

### pd.DataFrame()
データフレームの作成

```R:R
data.frame() #空のデータフレームを生成
data.frame(col1=c(x1, x2, x3), col2=c(y1, y2, y3)) #カラム
```

### pd.read_csv()
CSVファイル（カンマ区切りデータ）読み込み

```R:R
read.csv(ファイル名)
```

### pd.read_table()
TSV、CSVファイル（タブ区切りデータ）読み込み

```R:R
read.table(ファイル名)
```

### df.index = [行名1, 行名2, ...]
行名の設定

```R:R
rownames(df) <- c(行名1, 行名2, ...)
print(rownames(df)) #代入せず、呼び出せばベクトルとして取得できる
```
### df.columns = [列名1, 列名2, ...]
列名の設定

```R:R
colnames(df) <- c(列名1, 列名2, ...)
print(colnames(df)) #代入せず、呼び出せばベクトルとして取得できる
```

## データフレームの内容確認

### df.shape
行数、列数の取得

```R:R
dim(df)
```

### len(df)
行数の取得

```R:R
ncol(df)
```

### len(df.columns)
列数の取得

```R:R
nrow(df)
```

### df.head()
先頭行の出力

```R:R
head(df) #引数で表示行数の指定も可
```

### df.tail()
末尾行の出力

```R:R
tail(df) #引数で表示行数の指定も可
```


### df.info()
各カラムの数や型情報を表示する

```R:R
str(df)
```

### df.describe()
基本統計量の出力する

```R:R
summary(df) #ただし、stdは出力されない

#stdは、例えば下のように取得する
sds = NULL
for(col in colnames(df)){
  sds <- c(sds, sd(df[, col]))
}
names(sds) <- colnames(df)
```

### df.isna()
欠損値(NA)を確認する

```R:R
is.na(df)
```

### df.isna().sum()

カラムごとの欠損値(NA)の個数を確認する

```R:R
colSums(is.na(df))
# summary(df)でもNAの個数も出力されるので確認可能
```

### df[df.isna().any(axis=1)]
欠損値(NA)が1つでもある行を抽出する

```R:R
df[!complete.cases(df), ]
```

### df.col.unique()
ある列に登場するユニークな（重複のない）値を返す

```R:R
unique(df$col)
```

### df.col.value_counts()
ある列に登場する値の登場回数を返す

```R:R
table(df$col)
```

## データ抽出

### df.iloc[x1:x2, y1:y2]
行番号および列番号を用いて、範囲指定する

```R:R
df[x1:x2, y1:y2] #Rはインデックスの開始が1である点に留意
```

### df.iloc[[x1, x2, ...], [y1, y2, ...]]
行番号および列番号を用いて、リスト指定する

```R:R
df[c(x1, x2, ...), c(y1, y2, ...)]
```

### df.loc[行名1:行名2,  列名1:列名2]
行名および列名を用いて、範囲指定する

```R:R
#明確には存在しないようなので、やるならば下記
#指定の行名および列名の位置（番号）を取得し、それを範囲指定に用いる
x1 <- which(rownames(df) == 行名1)
x2 <- which(rownames(df) == 行名2)
y1 <- which(colnames(df) == 列名1)
y2 <- which(colnames(df) == 列名2)
df[x1:x2, y1:y2]
```

### df.loc[[行名1, 行名2, ...], [列名1, 列名2, ...]]
行名および列名を用いて、リスト指定する

```R:R
df[c(行名1, 行名2, ...), c(列名1, 列名2, ...)]
```

### df[df.col == x]
条件に合致する行を抽出する

```R:R
df[df$col == x, ]
#または
subset(df, col == x)
```

## データ加工

### df[new_col] = x
データフレームに新しいカラムを追加する

```R:R
df[, new_col] <- x
```

### df.drop()
行や列を削除する

```R:R
#削除したい行や列を選択し、NULLを代入することで削除ができる
df[c(x1, x2), ] <- NULL #行を削除
df[, c(y1, y2)] <- NULL #列を削除

#インデックスを負の値にすると、その番号を除外した行列を返す性質を利用して、次のようにも書ける
df <- df[c(-1, -2), ] #行を削除
df <- df[, c(-1, -2)] #列を削除
```

### df.fillna(x)
欠損値（NA）を埋める

```R:R
df[is.na(df)] <- x
```

### df.dropna()
欠損値（NA）が含まれる行を削除する

```R:R
na.omit(df)
```

### df.apply(func)
各要素1つずつに関数funcを適用する

```R:R
sapply(df, FUN =func)
```

### df.col.apply(func)
指定したカラムの各要素1つずつに関数funcを適用する

```R:R
sapply(df$x, FUN =func)
```

### df.T
行列を転置する

```R:R
t(df)
```

### pd.to_datetime()
日付型に変換する

```R:R
as.Date(df$col) #日付のみ（例：'2020-01-01'）
```

## データ集計

### df.max()、 df.min()
カラム毎の最大値、最小値を求める

```R:R
sapply(df, FUN =max)
sapply(df, FUN =min)

#applyでも同等の処理が可能
apply(df, MARGIN=2, FUN =max) #MARGIN=1とすると行毎に関数（FUN）を適用する
apply(df, MARGIN=2, FUN =min) #max(df)とした場合、全要素の中で最大値を求める（minも同様）
```

### df.groupby([x1, x2, ...]).agg(func)
グループ化して集計処理する

```R:R
aggregate(. ~ x1+x2, df, FUN=sum) #「.」は全カラムに対し集計処理を行う
aggregate(x ~ x1+x2, df, FUN=sum) #「x」で指定したカラムに対し集計処理を行う
```

### pd.pivot_table(df, index, columns, values)
baseパッケージにはない。たぶん。