Преобразовать надстрочные числа из строки в научную нотацию (из Unicode, UTF8) - PullRequest
1 голос
/ 03 июня 2019

Я импортировал вектор значений p из таблицы Excel. Числа даны в виде надстрочных строк Юникода. После нескольких часов попыток я все еще пытаюсь преобразовать их в числа.

См. Пример ниже. Простое преобразование с as.numeric() не работает. Я также пытался использовать Regex для захвата номеров с надстрочными знаками, но оказалось, что у каждого номера с надстрочным индексом есть отдельный код Unicode, для которого нет перевода.

test <- c("0.0126", "0.000289", "4.26x10⁻¹⁴", "6.36x10⁻⁴⁸", 
          "4.35x10⁻⁹", "0.115", "0.0982", "0.000187", "0.0484", "0.000223")

as.numeric(test)

Кто-нибудь знает о R-пакете, который мог бы выполнять перевод безболезненно, или я должен переводить коды один за другим в цифры?

1 Ответ

1 голос
/ 04 июня 2019

Этот вид форматирования определенно не очень переносим ... Вот одно из возможных решений для упражнения ...

test <- c("0.0126", "0.000289", "4.26x10⁻¹⁴", "6.36x10⁻⁴⁸",
          "4.35x10⁻⁹", "0.115", "0.0982", "0.000187", "0.0484",
          "0.000223")

library(utf8)
library(stringr)

# normalize, ie everything to "normal text"
testnorm <- utf8_normalize(test, map_case = TRUE, map_compat = TRUE)

# replace exponent part
# \\N{Minus Sign} is the unicode name of the minus sign symbol
# (see [ICU regex](http://userguide.icu-project.org/strings/regexp))
# it is necessary because the "-" is not a plain text minus sign...
testnorm <- str_replace_all(testnorm, "x10\\N{Minus Sign}", "e-")

# evaluate these character strings
p_vals <- sapply(X = testnorm,
                    FUN = function(x) eval(parse(text = x)),
                    USE.NAMES = FALSE
)

# everything got adjusted to the "e-48" element...
format(p_vals, digits = 2, scientific = F)
...