最近,我感到惊讶的是is.logical
和is.factor
无法与apply
开箱即用 - 至少他们没有提供正确的结果。
这是我可重复的小例子:
# 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
的东西可以找到我找不到的技巧。
答案 0 :(得分:7)
由于data.frame是list
,您应该使用lapply
或sapply
:
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"