在apply vs sapply中为.numeric

在apply vs sapply中为.numeric,r,R,在编写R代码来识别带有数字数据的列时,我遇到了一些问题,因此发现了这个问题: 在那一页中,我找到了答案,但我对问题本身的性质感到困惑。在该页面上,以下代码片段实现了我的预期: > 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

在编写R代码来识别带有数字数据的列时,我遇到了一些问题,因此发现了这个问题:

在那一页中,我找到了答案,但我对问题本身的性质感到困惑。在该页面上,以下代码片段实现了我的预期:

> 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 sapply(dat,is.numeric)
v1 v2 v3 v4
真假真假
但是,如果我改变了思维去应用,我就会明白是什么导致了我的问题

> 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 
>dat应用(dat,2是数字)
v1 v2 v3 v4
假假假假

为什么apply和sapply会产生不同的计算结果?

apply
将所有内容强制为同一类型。数字可以变成字符,但反之亦然。因此,一切都被强制为
字符
,以便应用于工作

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

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

help(apply)
-如果
X
不是数组,而是具有非空dim值(例如数据帧)的类的对象,则apply尝试通过
as.matrix
将其强制到数组中。如果它是二维(例如,数据帧)或通过
as.array
apply
lappy
是不同的函数,因此,难怪他们给出了不同的结果。请注意并充分理解它们的用途和使用时间。@RichardScriven-谢谢您提供的详细信息。我在申请表中没有看到这一点——很明显,我忽略了这一点,或者在正确的背景下不欣赏它。如果可以的话,我会投票或者接受你的答案。@nicola-我不记得在我的问题中提到过Lappy,但是是的,它与apply不同。@KirkDCO你提到过,因为
sapply
只是
Lappy
的包装,它“美化”了输出。如果
lappy
apply
不同,
sapply也不同。难怪你会得到不同的输出。如果有人感兴趣,这个答案中列出了强制规则---
character>complex>numeric>integer>logical>raw