【问题标题】:Is there a vectorized way to use is.numeric?是否有使用 is.numeric 的矢量化方式?
【发布时间】:2012-01-30 14:39:16
【问题描述】:

我在 SO 阅读 this question 并想知道是否有任何方法可以以矢量化方式使用 is.numeric。关键是,如果您有一种矢量化方法来检查变量是否为数字,那么任何依赖于数字变量的函数都可以被矢量化。否则无法向量化。

【问题讨论】:

  • is.numeric 是矢量化的...你能举个例子说明你在想什么吗?
  • 我假设提问者认为is.numeric(1:5) 应该给出一个 TRUE 5 long 的向量,而不是单个 TRUE。所以像sapply(1:5,is.numeric)
  • @Justin:啊,那么答案是“不”。您不能在原子向量中混合类型,因此为向量中的每个元素返回 TRUEFALSE 值将是多余的。您可以在列表中混合类型(这就是 data.frame),这就是您应该使用 sapply 解决方案的地方。
  • 罗杰。我只是想理解他的问题。
  • 是的,我正在考虑一个 data.frame 以及如何获取哪些列是数字或非数字,例如。看来我应该使用apply家族的任何合适的功能......

标签: r vectorization


【解决方案1】:

根据 cmets:

如果您希望使用 as.numeric 测试 data.frame 的列,请使用 apply

> 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 

或者,为了多样化,您可以使用 plyr 包中的colwise

> colwise(is.numeric)(dat)
    v1    v2   v3    v4
1 TRUE FALSE TRUE FALSE

【讨论】:

  • plyr 包有一个numcolwise 函数,可以自动将任何函数应用于数据框中的数字列。
【解决方案2】:

这应该会给出预期的结果:

rep(is.numeric(x), length(x))

【讨论】:

  • 但是,给定一个混合列表:x&lt;-list('a',2,'c',4),这将产生一个包含所有FALSE 的向量,因为is.numeric(x)FALSElapply(x,is.numeric) 给出了预期的结果。
  • @Justin:我期待输入是一个单一的“变量”,我认为它是一个原子向量。对于 hte question 措辞的不同解释,您的方法可能(l)适用。
猜你喜欢
  • 1970-01-01
  • 2011-08-01
  • 2018-06-21
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多