niszetの日記

10年目エンジニアが最近勉強したことを忘れないようにメモをする

R言語徹底解説 3章付近。listとdata.frame

この間ハマったので…

例のmidiを読んでdata.frameにするパッケージを作っていてハマったのですが、listを連結してas.data.frameにかけるときに注意が必要…

as.data.frame(rbind(list(a=1,b=2,c=7),list(e=1,f=2,g=3)))
#   a b c
# 1 1 2 7
# 2 1 2 3

str(as.data.frame(rbind(list(a=1,b=2,c=7),list(e=1,f=2,g=3))))
# 'data.frame':    2 obs. of  3 variables:
#  $ a:List of 2
#   ..$ : num 1
#   ..$ : num 1
#  $ b:List of 2
#   ..$ : num 2
#   ..$ : num 2
#  $ c:List of 2
#   ..$ : num 7
#   ..$ : num 3

一方、

data.frame(list(a=c(1,2),b=c(2,3),c=c(3,4)))
#   a b c
# 1 1 2 3
# 2 2 3 4

str(data.frame(list(a=c(1,2),b=c(2,3),c=c(3,4))))
# 'data.frame':    2 obs. of  3 variables:
#  $ a: num  1 2
#  $ b: num  2 3
#  $ c: num  3 4

なので、表示されるときはいい感じに解釈されているものの、中の構造が違うという話でした。

例のパッケージではリストを次々と足していく形でdata.frameにするわけですが、複数のlistをrbindしてからas.data.frameにしたがために列があっていないと言われ…
気を付けましょう…。