从R中的数字中提取第一个非零数字

Extracting the 1st non-zero digit from a numeric in R

有没有办法提取 R 中数值的第一个非零数字?

示例输入:

123.01, 0.56, 0.078, 0.0092

输出:

1, 5, 7, 9

这适用于正输入:

firstdigit <- function(x){ floor(x / 10 ^ floor(log10(x))) }
firstdigit(c(123.01, 0.56, 0.078, 0.0092))
# 1 5 7 9

您可以使用正则表达式来提取。使用 stringr 包:

set.seed(1)
x <- c(123.01, 0.56, 0.078, 0.0092)
x
#> [1] 123.0100   0.5600   0.0780   0.0092

stringr::str_extract(as.character(x), "([1-9]{1})")
#> [1] "1" "5" "7" "9"

您可以根据需要转换回数字。

您可以使用基数 R:

中的 sub()
x <- c("123.01", "0.56", "0.078", "0.0092", "-1.2", "-0.3", "-0.04", "100")

sub("[^1-9]*(.).*", "\1", x)

gsub()

y <- gsub("[^1-9]", "", x)
substr(y, 1,1)

这最后一个你可以修改以找到第二个数字:

y <- gsub("[^1-9]", "", x)
substr(y, 2,2)

来自评论:
对于这种情况,问题的措辞需要有所不同。
“提取前导零后的第二个数字”或“提取第二个有效数字”。

y <- sub("^[^1-9]*", "", x)
y <- gsub("\.", "", y)
substr(y, 2,2)

我们可以使用 gsub 删除前导 0,trimws 删除点和 0 个或多个零,然后使用 substr.

提取第一个字符
x <- c(123.01, 0.56, 0.078, 0.0092)
substr(trimws(gsub('^0', '', x), "left", "\.0*"), 1, 1)
#[1] "1" "5" "7" "9"