data.frame
Rで有用な非常に予期しない動作は、character
列を要素として保持することから発生します。これを考慮しないと、多くの問題が発生します。たとえば、次のコードがあるとします。
foo=data.frame(name=c("c","a"),value=1:2)
# name val
# 1 c 1
# 2 a 2
bar=matrix(1:6,nrow=3)
rownames(bar)=c("a","b","c")
# [,1] [,2]
# a 1 4
# b 2 5
# c 3 6
では、何を実行することを期待しますbar[foo$name,]
か?通常は、行'c'および'a'を意味するbar
に従って名前が付けられた行を返す必要があります。foo$name
しかし、結果は異なります。
bar[foo$name,]
# [,1] [,2]
# b 2 5
# a 1 4
理由はここにあります:foo$name
文字ベクトルではなく、整数ベクトルです。
foo$name
# [1] c a
# Levels: a c
期待される動作を実現するために、手動で文字ベクトルに変換します。
foo$name = as.character(foo$name)
bar[foo$name,]
# [,1] [,2]
# c 3 6
# a 1 4
しかし、問題は、これを実行するのを簡単に見逃す可能性があり、コードに隠れたバグがあることです。より良い解決策はありますか?