Рассчитать значащие цифры числа в R - PullRequest
0 голосов
/ 24 августа 2018

Может быть, глупый вопрос, но почему R удаляет значащий 0 в конце числа? Например, 1.250 становится 1.25, который имеет разную точность. Я пытался вычислить количество значащих цифр числа, используя as.character() в сочетании с gsub() и регулярными выражениями (согласно различным сообщениям), но я получаю неправильный результат для чисел, таких как 1,250, так как as.character удаляет последнюю цифру 0 Следовательно, ответ на вопрос 1.250 состоит из 2 цифр, а не 3, что является правильным.

Чтобы быть более конкретным, почему это проблема для меня:

У меня есть длинные таблицы в слове, состоящие из длин связей в формате, например: 1.2450 (20):

enter image description here

Число в скобках - это неопределенность измерения, которая означает, что реальное значение находится где-то между 1,2450 + 0,0020 и 1,2450-0,0020. Я импортировал все эти данные из слова в большой фрейм данных так:

df<-data.frame(Activity = c(69790, 201420, 17090),
               WN1=c(1.7598, 1.759, 1.760),
               WN1sd=c(17, 15, 3))

Моя цель - отобразить значения WN1 в зависимости от активности, но также включить индикатор ошибок. Это означает, что мне нужно будет вручную преобразовать WN1sd в: WN1sd=c(0.0017, 0.015, 0.003), что не является правильным способом R, поэтому необходимо получить число значащих цифр WN1. Это хорошо работает для первых двух значений WN1, но не для 3-го значения, поскольку R ошибочно считает, что последние 0 не являются значимыми.

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Вы должны подготовить стандартные отклонения в то время, когда вы импортируете свои данные из вашего текстового документа

Есть точка, где у вас должны быть такие строки:

"1.2345(89)" "4.230(34)" "3.100(7)"

Этофункция, которую вы можете применить к этим символам и получить правильный sd:

split.mean.sd = function(mean.sd) {
   mean <- gsub("(.*)\\(.*", "\\1", mean.sd)
   sd  <- gsub(".*\\((.*)\\)", "\\1", mean.sd)
   digits.after.dot <- nchar(gsub(".*\\.(.*).*", "\\1", mean))
   sd  <- as.numeric(sd)*10^(-digits.after.dot)
   mean <- as.numeric(mean)
   c(mean, sd)
   }

Например:

v <- c("1.2345(89)","4.230(34)","3.100(7)")
sapply(v, split.mean.sd)

дает вам

     1.2345(89) 4.230(34) 3.100(7)
[1,]     1.2345     4.230    3.100 
[2,]     0.0089     0.034    0.007
0 голосов
/ 24 августа 2018

Большинство языков программирования, включая R, не отслеживают количество значащих цифр для значений с плавающей запятой. Это связано с тем, что во многих случаях значимые цифры не нужны, что может значительно замедлить вычисления и потребовать больше оперативной памяти.

Возможно, вы захотите заинтересовать некоторые библиотеки для вычислений с неопределенностью, например пакет errors (PDF).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...