R筋

プログラミング、金融、育児

【R】webスクレイピングの超基礎

webスクレイピング用のライブラリrvestを使って、
取引所FXなどを展開する東京金融取引所のホームページから
清算価格を取得してみたいと思います。

取引所のホームページからは様々な取引データが取得できるため、
金融の分析などに使用できることも多いと思います。

#webスクレイピングライブラリ
library(rvest)
#ファイル出力用
library(readr)

#東京金融取引所のホームページを取得します
html <- read_html("https://www.tfx.co.jp/")
#divで、クラスが「chart_cel_03」のタグを取得します
div <- html_nodes(html,"div.chart_cel_03")
#テキストを取得します
text <- html_text(div)
#16番目がドル円の清算価格です
price <- as.numeric(text[16])
#priceテキストに追記して出力していきます
write_lines(price,"price.txt",append=T)

price.txtに昨日の清算価格が出力されました。

110.095

【R】dplyrでクロス集計

deplyrパッケージの使い方について実際に実行してご紹介します。

#deplyr読み込み
library(dplyr)
#iris読み込み
iris <- datasets::iris

#種類ごとに何個あるのかクロス集計
iris %>%
  dplyr::group_by(Species) %>%
  dplyr::summarise(total=n())

実行結果はこんな感じ。
# A tibble: 3 × 2
Species total

1 setosa 50
2 versicolor 50
3 virginica 50

標準のtable(iris$Species)でも同様の値がとれます。


ほかにも、

#SpeciesごとにPetal.widthの最大値を取得する
iris %>%
  dplyr::group_by(Species) %>%
  dplyr::summarize(max(Petal.Width))

によって以下のような結果を出せます。
# A tibble: 3 × 2
Species `max(Petal.Width)`

1 setosa 0.6
2 versicolor 1.8
3 virginica 2.5

【R】ヘッダーフッターをつけて出力する

データフレームをCSV出力する際に、ヘッダー行、フッター行をつけて出力する場合は、readrパッケージのwrite_linesを使用します。

library(readr)
#データフレームdfをワーキングディレクトリにexport.csvとして出力します。
path <- paste(getwd(),"export.csv",sep="/")
write_lines("header",path)
write.table(df,path,sep=",",row=F,col=F,append=T)
write_lines("footer",path,append=T)

一行出力の際に、writeLines()ではなく、
append=Tを設定できるwrite_lines()を使用するのがコツ。

【R】データフレーム最終行へのアクセス

データフレームの最終行を取得する方法を列挙します。

df <- data.frame(matrix(1:6, nrow=3, ncol=2))   
> df
  X1 X2
1  1  4
2  2  5
3  3  6

から

  X1 X2
3  3  6

を取り出す。

方法1

df[nrow(df),]

方法2

tail(df,n=1)

方法3

df[rev(row.names(df)),][1,]

【R】日付を操作する

日付の操作について、ご紹介します。 lubridate、RcppBDTライブラリがあります。

年・月・日を取得する(基本関数で)

date <- as.Date("2017-05-08")
year <- substr(date,1,4)
month <- substr(date,6,7)
day <- substr(date,9,10)

年・月・日を取得する(lubridateライブラリ)

library(lubridate)
year <- year(date)
month <- month(month)
date <- day(month)

月初にする(基本関数で)

paste(year,month,day,sep="-")

月初にする(lubridateライブラリ)

date - day(date) + 1

第3水曜日を取得(RcppBDTライブラリ)

library(RcppBDT)
getNthDayOfWeek(third, Wed, month(d), year(d)),date)

【R】NAの補完について

こんにちは!Rのこととか書いてきます。 まずは定番ですが、欠損値NAについて、補完の方法を列挙します。

・特定の値を入力する

df[is.na(df)] <- 0

・NAを含む行を削除する

 na.omit(df)
 na.rm(df)

・前後の値の平均値を取る

install.packages("zoo")
library(zoo)
z <- zoo(c(1,NA,5))
na.approx(z)

・同じ行にある別の列の値を入れる

df <- data.frame(A=c(1,2,3),B=c(2,NA,3))
df$B[which(is.na(df$B))] <- df$A[which(is.na(df$B))]

追記 ・直前の値を入れる

library(zoo)
z <- zoo(c(1,NA,5))
na.locf(z)