自分用 R tips

**:warning: 随時加筆修正**
・頻繁に加筆修正するので、無駄に通知が飛ぶと思います。
・自分用なので、読みにくいと思ったタイミングで適宜構造を変えていきます。

**必要なライブラリの読み込み**

```r
libs <- c('tidyverse', 'rvest', 'plotly')
sapply(libs, library, character.only = T)
```

<!--
******************************************************************************************
* データ取得
******************************************************************************************
  -->
## :muscle: データ取得 / 書き込み ( rvest, httr, etc ) :muscle:

### rvestによるスクレイピング

```{r}
html <- read_html('https://medium.com/tag/data-science/latest')
divs <- html %>% html_nodes(xpath = '//div[contains(@class, "streamItem")]')
div %>% html_nodes(xpath='//h3') %>% html_text()
```

### httrでGET/POST

```r
# GET
headers <- add_headers(Authorization=paste0('Key ', api_key))
resp <- GET(paste0(base_url, '/api/queries'), headers)
cont <- content(resp, 'parsed') # parsedでコンテントタイプを見て適切に変換してくれる

# POST
POST(hook_url, 
     encode = 'form',
     add_headers(`Content-Type` = "application/x-www-form-urlencoded", Accept = "*/*"),
     body = URLencode(sprintf('payload={"text": "%s", "username": "%s", "icon_url":"%s"}', text, username, icon_url)))
```

### DBIとSQLiteの初期化

```r
conn <- dbConnect(SQLite(), 'url_db.sqlite', synchronous = 'off')
tbls <- dbListTables(conn)

# すでにテーブルがあるかどうか確認
if (!(table_name %in% tbls)) {
  dbSendQuery(conn, sprintf('CREATE TABLE %s(url text, bkm int)', table_name))
}
```

<!--
******************************************************************************************
* データ加工
******************************************************************************************
  -->
## :metal: データ加工 ( dplyr, tidyr, etc ) :metal:

### 数字列のみを抽出

```{r}
df <- data.frame(
  a=1:10,
  b=rep('y', 10)
)
df %>% select_if(is.numeric)
```

### CSVを読み込む時にcol_types指定

```r
csv <- read_csv('test.csv', col_types=list(col_integer(), col_character()))
```

### データフレームの行ごとに処理を行う

```r
df <- data_frame(X=1:9)
df %>% rowwise() %>% mutate(new_val=X)
```

### データフレーム中にベクターがある時のフィルタリング

```{r}
d <- data.frame(X=c(1, 2, 3))
d$Y <- list(c(1, 2), c(2, 3), c(4, 5))
d %>% dplyr::filter(sapply(Y, function(vec) 2 %in% vec)) #Y列に2がある行だけフィルタリング
```

### 行の値ごとの集計

```{r}
d <- data.frame(X=c(1, 2, 2, 3, 4, 5, 6))
dplyr::count(d, X)
```

### id列で整列

```{R}
df <- data.frame(id=c(3,5,6,8,1),data=rep(1,5))
df
odf <- df[order(df$id),]
odf
```

### データフレームの行ごとのfor

色々やり方はあるようだけど、それほど行がなければfor&nrowでいける。

```r
issues <- orig_issues[pic == orig_issues$`担当者`,]
df_issues <- rbind(df_issues, c(1, 0, paste0('===== 担当者:', pic, ' ====='), '-----', pic, 'Version 1'))
for (i in 1:nrow(issues)) {
  iss <- issues[i,]
  if (is_invalid_issue(iss)) next
  df_issues <- rbind(df_issues, c(2, to_id(iss) + 10000, to_desc(iss), '-----', pic, to_wiki(iss), 'Version 1'))
}
```

<!--
******************************************************************************************
* データ分析
******************************************************************************************
  -->
## :punch: データ分析 :punch:

### データがどのくらい正規分布と差異があるのか調べる

```{R}
qqnorm(diamonds$carat)
```

<!--
******************************************************************************************
* データ可視化
******************************************************************************************
  -->
## :eyes: データ可視化 ( ggplot2, etc ) :eyes:

### グラフ内ラベルで日本語文字を使う
oldに代入しているのは、テーマを戻す時用。

```{r}
old <- theme_set(theme_gray(base_family="HiraKakuProN-W3"))
```

### 主成分分析をggplotで描画
autoplotを使うと綺麗に固有値ベクトルまで描画してくれる。

```{r}
df.prc <- data.frame(
  x=rnorm(100),
  y=rnorm(100),
  c=c(rep(1.0, 50), rep(2.0, 50))
)
autoplot(prcomp(df.prc, scale=T, center=T), data=df.prc, colour='c', loadings=T, loadings.label=T)
```

### 同じ系統のデータを一つのグラフに別々に描画

gatherでデータフレームの形状を変化させて描画。

```r
df_plot <- df_dau %>% gather('key', `描画用データ`)
g <- ggplot(df_plot, aes(x=date, y=`描画用データ`))
g + geom_bar(aes(fill = key), stat='identity') + labs(title='テストグラフ') + scale_x_date(labels = date_format('%Y/%m/%d')) + theme_gray(base_family = "HiraKakuPro-W3")
# scale_x_dateで、横軸にいい感じに日付のラベルを書く
```