apply和sapply中的is.numeric

Kir*_*-CO 4 r

在编写R代码以识别具有数字数据的列时,我遇到了一些问题并在SO上发现了这个问题: 是否有使用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 
Run Code Online (Sandbox Code Playgroud)

但如果我改变申请,我会找到导致我问题的原因.

> 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 
Run Code Online (Sandbox Code Playgroud)

为什么申请和sapply导致不同的评估?

Señ*_*r O 8

apply将所有内容强制转换为相同的类型.数字可以成为字符,但反之则不然.所以一切都被强制character适用于工作.

> apply(dat[,1, drop = F], 2, is.numeric)
  v1 
TRUE 
Run Code Online (Sandbox Code Playgroud)

  • 如果有人有兴趣,可以在这个答案中列出强制规则 - http://stackoverflow.com/questions/17030173/why-does-hello-0-return-true/17030209#17030209 - `character> complex> numeric>整数>逻辑>原始 (2认同)