什么是逻辑R函数,用于确定向量是否为数字

时间:2014-09-17 07:50:05

标签: r

假设我有矢量:

      a <- c(1,2,3, "bob", "avery", "banana123", 3,4)

什么是一个函数告诉我向量中的每个条目是否都是数字?我尝试了is.numeric,但由于向量中的非数字条目,它返回FALSE。我想知道是否有一个函数会返回

     TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE

5 个答案:

答案 0 :(得分:2)

您可以使用正则表达式来确定有效的数值:

test <- c(1, 2, 3, 0, 2.3, 0.22, ".33", "+3", "-.4", "a1", "1a", "aa")

grepl("^([-+]?\\d*\\.?\\d+)$", test)
# [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE

as.numeric(grep("^([-+]?\\d*\\.?\\d+)$", test, value = TRUE))
# [1]  1.00  2.00  3.00  0.00  2.30  0.22  0.33  3.00 -0.40

答案 1 :(得分:1)

粗略的方法是使用as.numeric

!is.na(sapply(a, as.numeric))
    1     2     3     a     3     4 
 TRUE  TRUE  TRUE FALSE  TRUE  TRUE 
# Warning message:
# In lapply(X = X, FUN = FUN, ...) : NAs introduced by coercion

但你必须忽略这些警告。 @akrun提供的解决方案更优雅:

grepl("[0-9]", a)
[1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE

要仅保留数字条目,可以使用布尔向量进行子集化:

as.numeric(a[grepl("[0-9]", a)])
[1] 1 2 3 3 4

答案 2 :(得分:1)

您可以对定义的数值范围使用%in%。在这里我使用零到99。

> a <- c(1, 2, 3, "bob", "avery", "banana123", 3, 4)
> a %in% 0:99
# [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE

答案 3 :(得分:1)

我会说尝试:

grep("^[0-9]+$", a, value=TRUE)
#[1] "1" "2" "3" "3" "4"

索引是:

 grepl("^[0-9]+$", a)
#[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE

#data
a <- c(1,2,3, "bob", "avery", "banana123", 3,4)

使用@Sven Hohenstein的数据,另一种可能性是:

library(stringr)
as.numeric(test[!str_detect(test, "[^0-9.+-]")])
#[1]  1.00  2.00  3.00  0.00  2.30  0.22  0.33  3.00 -0.40

答案 4 :(得分:1)

由于矢量中有一个字符串,因此R将矢量的所有元素都解释为字符。

a <- c("bob", "george", 3,4,5)
a    
[1] "bob"    "george" "3"      "4"      "5"   

您需要使用正则表达式。

假设没有任何真实的字符元素("george"bob)不包含数字,您可以使用@akrun建议的内容:

a <- c("bob", "george", 3,4,5321.428,-7)
grepl("[0-9]", a)
 FALSE FALSE  TRUE  TRUE  TRUE  TRUE