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

从R中的数字中提取第一个非零数字,r,extract,numeric,R,Extract,Numeric,有没有办法提取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 firstdigit您可以使用正则表达式进行提取。使用stringr包: set.seed(1) x[

有没有办法提取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

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

set.seed(1)
x[1]123.0100.5600.0780 0.0092
stringr::str_extract(如.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)
最后,您可以修改以查找第二个数字:

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

y我们可以使用
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"

x谢谢!我猜
abs()
也会将其扩展到负输入。这对我来说非常有用,因为我可以很容易地将其扩展到第二个数字的情况,这将在以后的分析中需要。非常感谢。非常感谢。但是,如果第二个数字是0(即100),则第二个数字版本不起作用。如果没有第二个非零数字,结果应该是什么?在这种情况下,问题的措辞需要不同。“提取前导零后的第二个数字”或“提取第二个有效数字”。
y <- sub("^[^1-9]*", "", x)
y <- gsub("\\.", "", y)
substr(y, 2,2)
x <- c(123.01, 0.56, 0.078, 0.0092)
substr(trimws(gsub('^0', '', x), "left", "\\.0*"), 1, 1)
#[1] "1" "5" "7" "9"