as.numeric(10^3) ​​Предупреждающее сообщение: NA введены путем принуждения

Попытка заставить этот вектор быть числовым:

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"


person Danilo Correa    schedule 17.09.2019    source источник


Ответы (2)


разделите строки на ^, а затем принудите каждую часть по отдельности. Мы должны избегать использования \\, потому что ^ — это специальный символ регулярного выражения.

sapply(strsplit(vec, "\\^"), function(x){
    as.numeric(x[1])^as.numeric(x[2])
})
#[1] 1e+02 1e+03 1e+06    NA 1e+09
person d.b    schedule 17.09.2019

Здесь мы можем использовать eval(parse, так как это выражение

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 с read.table, используя sep как ^, а затем использовать

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

Или, как предложил @d.b

read.table(text = paste(gsub("0\\^", "e", replace(vec, vec == "", NA)),
     collapse="\n"), header = FALSE)
person akrun    schedule 17.09.2019
comment
Вы могли бы также сделать eval(parse(text = paste0("c(", paste(replace(vec, vec == "", NA), collapse = ","), ")"))) - person d.b; 17.09.2019
comment
Кроме того, read.csv(text = paste(gsub("0\\^", "e", vec), collapse = ","), header = FALSE) - person d.b; 17.09.2019