文字列と数値列を持つdata.frameの行に適用を使用する場合、applyはas.matrixを内部的に使用して、data.frameを文字のみに変換します。ただし、数値列が異なる長さの数値で構成されている場合、as.matrixは、最大/「最長」の数値に一致するようにスペースを追加します。
例:
df <- data.frame(id1=c(rep("a",3)),id2=c(100,90,8), stringsAsFactors = FALSE)
df
## id1 id2
## 1 a 100
## 2 a 90
## 3 a 8
as.matrix(df)
## id1 id2
## [1,] "a" "100"
## [2,] "a" " 90"
## [3,] "a" " 8"
結果は次のようになると思っていました。
id1 id2
[1,] "a" "100"
[2,] "a" "90"
[3,] "a" "8"
なぜ余分なスペース?
data.frameでapplyを使用すると、予期しない結果が生じる可能性があります。
myfunc <- function(row){
paste(row[1], row[2], sep = "")
}
> apply(df, 1, myfunc)
[1] "a100" "a 90" "a 8"
>
whileループを実行すると、期待どおりの結果が得られます。
> for (i in 1:nrow(df)){
print(myfunc(df[i,]))
}
[1] "a100"
[1] "a90"
[1] "a8"
と
> paste(df[,1], df[,2], sep = "")
[1] "a100" "a90" "a8"
as.matrixで追加された余分なスペースが役立つ状況はありますか?