1

试图将此向量强制为数字:

vec <- c("10^2", "10^3", "10^6", "", "10^9")

vec <- as.numeric(vec)

[1] NA NA NA NA NA

Warning message:
NAs introduced by coercion

所需的输出:

[1] “100” “1000” “1e+06” “” “1e+09”

4

2 回答 2

1

在这里,我们可以使用eval(parseas 它是一个表达式

lst1 <- lapply(vec, function(x) eval(parse(text = x)))
lst[sapply(lst1, is.null)] <- NA
unlist(lst1)
#[1] 1e+02 1e+03 1e+06    NA 1e+09

或者以一种紧凑的方式,replace将空白 ( "") 与NA然后执行eval(parse

sapply(replace(vec, vec == "", NA), function(x) eval(parse(text = x)))

或者另一种选择是read使用as然后read.table使用sep^

with(read.table(text = paste(vec, collapse="\n"), sep="^", header = FALSE), V1^V2)

或如@db 建议的那样

read.table(text = paste(gsub("0\\^", "e", replace(vec, vec == "", NA)),
     collapse="\n"), header = FALSE)
于 2019-09-17T17:49:56.250 回答
1

拆分字符串,^然后单独强制每个部分。我们必须使用转义,\\因为^它是一个特殊的正则表达式字符。

sapply(strsplit(vec, "\\^"), function(x){
    as.numeric(x[1])^as.numeric(x[2])
})
#[1] 1e+02 1e+03 1e+06    NA 1e+09
于 2019-09-17T17:51:01.310 回答