をプログラムとして見たときに注意・検討すべきところを学んでおきたい、ということで
を読んでいく。
前回
5. データフレーム
データフレームは、直感的には2次元の行列である。しかし行列とは異なり、それぞれの列を異なるモードとすることができる。技術的には、データフレームはリストで、そのリスト成分は互いに長さの等しいベクトルである。
5.1 データフレームの作成
kids <- c("Jack","Jill") ages <- c(12, 10) df <- data.frame(kids, ages, stringsAsFactors = F) # データフレーム作成時、デフォルトでは文字列をファクターにする。これを防ぐのがstringsAsFactors = F(ALSE)である。
5.1.1 データフレームへのアクセス
データフレームはリストであるため、その成分にアクセスするには、成分インデックス値または成分名でアクセスできる。さらに行列のようにアクセスすることも可能である。
df[[1]] df$kids d[,1] str(df)
5.2 その他の行列的な操作
データフレームにも様々な行列操作を適用できる。最も重要かつ便利な操作は、フィルタリングを行なって様々なサブデータフレームを抽出できることである。
5.2.1 サブデータフレームの抽出
df[1:2,] df[1:2,2] df[1:2,2,drop = F] # データフレームを維持するにはdrop = FALSEとする
5.2.2 NA値の取り扱い
状況によってはオプションを用いて、明示的にを無視させなければならない。
関数でサブデータフレームを抽出するには、を指定する必要がない。
また少なくとも1つのを持つ観測値をデータフレームから除く場合には関数が有用である。
# complete.case()で完全な行のみを残す d4 <- data.frame(kids = c("Jack",NA,"Jillian","John"), states = c("CA","MA","MA",NA)) complete.cases(d4) d5 <- d4[complete.cases(d4),] d5
5.2.3 rbind()とcbind()
行列で用いた()および()はデータフレームにも利用可能である。ただしサイズが一致している必要がある。
d4 <- data.frame(kids = c("Jack",NA,"Lillian","John"), states = c("CA","MA","MA",NA)) complete.cases(d4) d5 <- d4[complete.cases(d4),] d5 d <- data.frame(kids = c("Jack","Jill"),ages = c(12,10)) rbind(d, list("Laura",19)) # 行を追加 cbind(d,c("CA","MA")) # 列を追加 d$states <- c("CA","MA") # 既存でない列名を指定し、値を代入すれば、新しい列を追加することができる d
5.2.4 apply()の適用
列がすべて同じ型の場合、データフレームに()関数を適用できる*1。
5.3 データフレームのマージ
データフレームをマージするには、()関数を用いる。
# データフレームのマージ d <- data.frame(kids = c("Jack","Jill"),ages = c(12,10)) rbind(d, list("Laura",19)) # 行を追加 cbind(d,c("CA","MA")) # 列を追加 d$states <- c("CA","MA") # 既存でない列名を指定し、値を代入すれば、新しい列を追加することができる d d1 <- data.frame(kids = c("Jack","Jill","Jillian","John"), states = c("CA","MA","MA","HI")) d2 <- data.frame(ages = c(10,7,12), kids = c("Jill","Lillian","Jack")) merge(d1,d2,by = "kids") # kids列をキーにマージする
*1:無論、行側にも適用できる。