自分用 R tips

  • 1
    いいね
  • 0
    コメント

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

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

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

:muscle: データ取得 / 書き込み ( rvest, httr, etc ) :muscle:

rvestによるスクレイピング

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

# 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の初期化

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:

数字列のみを抽出

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

CSVを読み込む時にcol_types指定

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

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

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

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

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がある行だけフィルタリング

行の値ごとの集計

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

id列で整列

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

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

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

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:

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

qqnorm(diamonds$carat)

:eyes: データ可視化 ( ggplot2, etc ) :eyes:

グラフ内ラベルで日本語文字を使う

oldに代入しているのは、テーマを戻す時用。

old <- theme_set(theme_gray(base_family="HiraKakuProN-W3"))

主成分分析をggplotで描画

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

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でデータフレームの形状を変化させて描画。

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で、横軸にいい感じに日付のラベルを書く