如何使用套用向量?

时间:2019-11-07 18:25:00

标签: r arrays apply

假设我有一个data.frame之类的

a <- data.frame(col1=1:6,
                col2=c('a','b',1,'c',2,3),
                stringsAsFactors=F)
a

  col1 col2
1    1    a
2    2    b
3    3    1
4    4    c
5    5    2
6    6    3

我想要一个向量来说明哪些行以col2作为数字。我正在尝试类似

apply(a$col2,1,is.numeric)

apply(a$col2,FUN=is.numeric)

但总是说

Error in apply(a$col2, 1, is.numeric) : 
  dim(X) must have a positive length

如果a$col2(适用的X)必须是矩阵,那么为什么函数的帮助说:

  

X:包含矩阵的数组。

关于数组的帮助说:

  

R中的数组可以具有一个,两个或多个维度。

如果数组只能具有一维,那么为什么不能在apply中使用一维数组?我在这里想念什么?

(除此之外,我仍然想知道如何在不使用循环的情况下在col2中找到数字行。)

1 个答案:

答案 0 :(得分:2)

首先请注意,即使col2中的数字也是字符,因为当与其他字符元素组合时,它们会被强制转换为字符。

str(a)
## 'data.frame':   6 obs. of  2 variables:
##  $ col1: int  1 2 3 4 5 6
## $ col2: chr  "a" "b" "1" "c" ...

1)grepl ,因此我们应该使用如下字符处理:

grepl("^\\d+$", a$col2)
## [1] FALSE FALSE  TRUE FALSE  TRUE  TRUE

grepl经过向量化处理,因此我们不需要apply或相关函数来迭代col2的元素。

2)( apply)也可以使用,但是由于grepl单独起作用,因此似乎不必要地参与其中:

sapply(a$col2, grepl, pattern = "^\\d+$")
##     a     b     1     c     2     3 
## FALSE FALSE  TRUE FALSE  TRUE  TRUE 

apply(array(a$col2), 1, grepl, pattern = "^\\d+$")
## [1] FALSE FALSE  TRUE FALSE  TRUE  TRUE

3)type.convert 。另一种方法是使用type.convert,如果可以将其表示为数字,则可以转换为数字。然后我们可以使用is.numeric

sapply(a$col2, function(x) is.numeric(type.convert(x)))
##     a     b     1     c     2     3 
## FALSE FALSE  TRUE FALSE  TRUE  TRUE