假设我有一个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
中找到数字行。)
答案 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