在编写R代码以识别带有数字数据的列时,我遇到了一些问题并在SO上找到了这个问题:Is there a vectorized way to use is.numeric?
在那个页面中,我找到了答案,但我对问题本身的性质感到困惑。在该页面上,以下代码片段完成了我的预期:
> dat <- data.frame(v1=1:5,v2=letters[1:5],v3=rnorm(5),v4=c(1,2,'c','d',5))
> sapply(dat,is.numeric)
v1 v2 v3 v4
TRUE FALSE TRUE FALSE
但是,如果我改变申请,我会找到导致我问题的原因。
> dat <- data.frame(v1=1:5,v2=letters[1:5],v3=rnorm(5),v4=c(1,2,'c','d',5))
> apply(dat,2,is.numeric)
v1 v2 v3 v4
FALSE FALSE FALSE FALSE
为什么申请和公平导致不同的评估?
答案 0 :(得分:8)
apply
将所有内容强制转换为相同的类型。数字可以成为字符,但反之则不然。所以一切都被强迫character
申请工作。
> apply(dat[,1, drop = F], 2, is.numeric)
v1
TRUE
答案 1 :(得分:2)
apply
不建议用于数据框,因为它会强制转换为矩阵。矩阵,您可能知道矩阵中的所有列必须具有相同的模式(数字,字符等)...默认情况下apply
将列转换为字符。