【问题标题】:is.numeric within apply vs sapplyis.numeric 在 apply 与 sapply 中
【发布时间】:2016-08-30 11:32:34
【问题描述】:

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

但如果我将 sapply 更改为 apply,我就会找到导致我的问题的原因。

> 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 

为什么 apply 和 sapply 会导致不同的评估?

【问题讨论】:

  • help(apply) - 如果X 不是数组,而是具有非空暗值的类的对象(例如数据框),则尝试将其强制为如果数组是二维的(例如,数据框),则通过as.matrix 或通过as.array 获得数组。
  • applylapply 是不同的函数,难怪它们给出不同的结果。请注意充分了解它们的作用以及何时使用它们。
  • @RichardScriven - 感谢您提供的详细信息。我在申请中没有看到那一点 - 显然我忽略了它或者在正确的上下文中没有欣赏它。如果可以的话,我会赞成或接受你的回答。
  • @nicola - 我不记得在我的问题中提到 lapply,但是是的,它与 apply 不同。
  • @KirkDCO 你做到了,因为sapply 只是lapply 的包装器,它“美化”了输出。如果lapplyapply 不同,那么sapply 也不同。难怪你得到不同的输出。

标签: r


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-07-07
    • 2013-10-31
    • 1970-01-01
    • 2016-06-28
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    相关资源
    最近更新 更多