cbind関数はRでデータの前処理に頻繁に使用する関数で、その役割としては行数の等しいデータフレームや行列同士を結合します。
私は、for文のなかにいれて複数の同種類のファイル同士を結合させるときによく使います。
この記事ではfor文中でcbindを使うときの注意点を記録しておきます。
カレントディレクトリにあるcsvファイルをすべて読みこんで列方向に結合(つまり行ではなく列が増えていく)していきたいとします。
例えばこういうコードを書いたとしましょう。
lfs <- list.files(pattern=".csv")
df_out <- NULL
for(i in lfs){
df_tmp <- read.csv(i, header=T)
df_out <- cbind(df_out, df_tmp)
}
こうしてしまうと、「引数に異なる列数のデータフレームが含まれています」というエラーになります。一回目のループでつまづきます。
エラーの原因は、NULLとデータフレームをcbindで結合させようとしたことです。cbind関数ではNULLと結合できるのはベクトルか行列です。read.csvで読み込んだものは自動的にデータフレームになりますので、それらは結合できない、というわけです。なのでこうすれば動きます。
lfs <- list.files(pattern=".csv")
df_out <- NULL
for(i in lfs){
df_tmp <- read.csv(i, header=T)
df_mtx <- as.matrix(df_tmp)
df_out <- cbind(df_out, df_mtx)
}
as.matrixでデータフレームを行列に変換するだけです。ちなみに、cbindはNULLとベクトルなら結合できますので、最初のコードで
df_out <- cbind(df_out, df_tmp[,1])
などとすると、df_tmp[,1]はベクトルになるので、エラーはでません。