1

apply文字列を含むdata.frameを呼び出すと、他のすべての要素は、提供された関数に渡される前に文字列に強制変換されているように見えます。

> x<-data.frame(a=1:3,b=6:8)
> apply(x,1,function(y){y["b"]})
[1] 6 7 8
> x<-data.frame(a=1:3,b=6:8,d=c("a","bc","def"))
> apply(x,1,function(y){y["b"]})
[1] "6" "7" "8"
> 

なぜこうなった?どうすればそれを回避できますか?

4

2 に答える 2

5

これが発生する理由は、apply関数が data.frame を行列に変換してから操作を実行するためです。コードを見ると、次のapplyことがわかります。

if (is.object(X)) 
    X <- if (dl == 2L) 
        as.matrix(X)
    else as.array(X)

行列は 1 つのデータ型のみを保持でき、複数ある場合は最高レベルのデータ型に強制します。あなたの場合、キャラクター。代わりに何ができますか?aaplyからを使用しplyrます。わずかな変更を加えてコードを実行します ([[代わりに を使用し[て、データ フレームではなくベクトルを返します)。

x<-data.frame(a=1:3,b=6:8,d=c("a","bc","def"))
library(plyr)
aaply(x, 1, function(y){y[["b"]]}, .expand=FALSE)

1 2 3 
6 7 8 
于 2012-11-23T01:52:28.887 に答える
0

1つの解決策は、yをdata.frameに変換することです

apply(x,1,function(y){as.data.frame(y)[2,]})

[1] 6 7 8

于 2012-11-23T01:50:33.563 に答える