apply和sapply中的is.numeric

时间:2016-05-04 20:47:46

标签: r

在编写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 

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

2 个答案:

答案 0 :(得分:8)

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

> apply(dat[,1, drop = F], 2, is.numeric)
  v1 
TRUE 

答案 1 :(得分:2)

apply不建议用于数据框,因为它会强制转换为矩阵。矩阵,您可能知道矩阵中的所有列必须具有相同的模式(数字,字符等)...默认情况下apply将列转换为字符。