【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)