Попытка заставить этот вектор быть числовым:
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"
Попытка заставить этот вектор быть числовым:
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"
разделите строки на ^
, а затем принудите каждую часть по отдельности. Мы должны избегать использования \\
, потому что ^
— это специальный символ регулярного выражения.
sapply(strsplit(vec, "\\^"), function(x){
as.numeric(x[1])^as.numeric(x[2])
})
#[1] 1e+02 1e+03 1e+06 NA 1e+09
Здесь мы можем использовать 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)
eval(parse(text = paste0("c(", paste(replace(vec, vec == "", NA), collapse = ","), ")")))
- person d.b; 17.09.2019
read.csv(text = paste(gsub("0\\^", "e", vec), collapse = ","), header = FALSE)
- person d.b; 17.09.2019