4

最近、私は、箱から出してすぐに使い切ることができなかったという事実is.logicalに驚いていました–少なくとも彼らは正しい結果を提供しませんでした。is.factorapply

これが私の小さな再現可能な例です:

# generate a dataset that contains a couple of modes
someDf <- data.frame(fac1=gl(2,3,12),
                 int=1:12,
                 char=letters[1:12],
                 logi=rep(c(T,F),6),
                 fac2=gl(3,2,12))

# hooray, this did work, got factors, int,
# characters and logical
str(someDf)

# I expected this to work, but it didn't
# everything is just FALSE
apply(someDf,2,is.logical)

私はあきらめず、これをこっそりと回避する方法を見つけました。

unlist(lapply(names(someDf),function(x) is.logical(someDf[,x])))

これは正しい結果をもたらしますが、なぜそれがそれほど複雑でなければならないのか、そしてそれを解決するためのより簡単なものがあるのだろうかと思います。何か案は?

ヒント:私はそれを見ました

apply(someDf,2,class)

すべてを提供しますcharacters。これも意外です。多分何かがeval私が見つけることができなかったトリックをします。

4

1 に答える 1

7

data.frameはであるため、または:listを使用する必要があります。lapplysapply

sapply(someDf, is.logical)
 fac1   int  char  logi  fac2 
FALSE FALSE FALSE  TRUE FALSE 

コードが機能しない理由はapply、引数として行列が必要であり、データフレームを指定すると行列に強制されるためです。行列は単一のクラスの要素しか持てないため、値はに変換されcharacterます。それを試してみてください:

as.matrix(someDf)
      fac1 int  char logi    fac2
 [1,] "1"  " 1" "a"  " TRUE" "1" 
 [2,] "1"  " 2" "b"  "FALSE" "1" 
 [3,] "1"  " 3" "c"  " TRUE" "2" 
 [4,] "2"  " 4" "d"  "FALSE" "2" 
 [5,] "2"  " 5" "e"  " TRUE" "3" 
 [6,] "2"  " 6" "f"  "FALSE" "3" 
 [7,] "1"  " 7" "g"  " TRUE" "1" 
 [8,] "1"  " 8" "h"  "FALSE" "1" 
 [9,] "1"  " 9" "i"  " TRUE" "2" 
[10,] "2"  "10" "j"  "FALSE" "2" 
[11,] "2"  "11" "k"  " TRUE" "3" 
[12,] "2"  "12" "l"  "FALSE" "3" 
于 2012-09-20T08:15:36.717 に答える