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