LoginSignup
1
2

More than 5 years have passed since last update.

自分用 R tips

Last updated at Posted at 2017-05-10

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2