「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。目下、データ分析・語学に力点を置いています。今月(2022年10月)からは多忙につき、日々の投稿数を減らします。

MENU

プログラムとしてのRを学ぶ(その05/16)

 \mathrm{R}をプログラムとして見たときに注意・検討すべきところを学んでおきたい、ということで

を読んでいく。

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値の取り扱い

 状況によってはオプション\mathrm{na.rm\ =\ TRUE}を用いて、明示的に\mathrm{NA}を無視させなければならない。
 \mathrm{subset()}関数でサブデータフレームを抽出するには、\mathrm{na.rm\ =\ TRUE}を指定する必要がない。
 また少なくとも1つの\mathrm{NA}を持つ観測値をデータフレームから除く場合には\mathrm{complete.cases}()関数が有用である。

# 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()

 行列で用いた\mathrm{rbind}()および\mathrm{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()の適用

 列がすべて同じ型の場合、データフレームに\mathrm{apply}()関数を適用できる*1

5.3 データフレームのマージ

 データフレームをマージするには、\mathrm{merge}()関数を用いる。

# データフレームのマージ
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:無論、行側にも適用できる。

プライバシーポリシー お問い合わせ