假设我有矢量:
a <- c(1,2,3, "bob", "avery", "banana123", 3,4)
什么是一个函数告诉我向量中的每个条目是否都是数字?我尝试了is.numeric
,但由于向量中的非数字条目,它返回FALSE。我想知道是否有一个函数会返回
TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE
答案 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