Конкретное количество десятичных знаков в зависимости от размера числа

Я пытаюсь показать «значащие цифры» моего набора данных. У меня есть набор данных как с высокими, так и с низкими числами, которые я хочу представить в таблице данных (под таблицей данных здесь я имею в виду цифру в документе, а не таблицу данных (DT) в R). Я не хочу останавливаться на фиксированном числе десятичных знаков. Мне нужны числа> 10 = 0 десятичных знаков, числа от 10 до> 0 = 1 десятичный знак, от 0 до 0,1 = 2 десятичных знака, от 0,1 до> 0,01 = 3 десятичных знака, <0,01 = 4 десятичных знака

Я пытался использовать функции из пакета, который делает что-то подобное, но у меня это не сработало. Это то, что я пробовал

options(pillar.sigfig = 1)
df <- as_tibble(df)

А вот данные

df <- structure(list(i.x33.031 = c(13.6221, 0, 104.5006, 28.952, 26.0536, 
4.1116, 62.0904, 136.6475, 0, 292.2651, 6.4563, 94.7135, 34.7291, 
17.8716, 28.9009, 52.2754, 20.5167, 34.3839, 33.5275, 14.7052, 
141.8956, 30.9969, 23.1827, 28.1245, 1.5097, 36.9295, 26.0542, 
29.4029, 152.541, 1.6365), i.x35.034 = c(0.1233, 0, 0.0351, 0.0407, 
0.0497, 0.0153, 0.0856, 0.2297, 0, 0.3863, 0.0032, 0.1962, 0.0873, 
0.0362, 0.0378, 0.1137, 0.0459, 0.0715, 6e-04, 0.0318, 0.3318, 
0.0005, 0.0643, 0.0588, 0.0008, 0.0588, 0.0627, 0.0789, 0.3215, 
0.0215), days_incubated = c(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4)), row.names = c(NA, 
-30L), class = c("tbl_df", "tbl", "data.frame"))

каков ваш желаемый результат?

DPH 11.12.2020 16:33

Привет @DPH, я немного конкретизировал свой вопрос.

Tiptop 14.12.2020 09:10

Разве вы не можете просто написать использовать некоторые операторы if для создания таблицы? для числа в списке: если число == (10^1) число = число округлено

Fokke 14.12.2020 09:11

Возможно, но я не совсем уверен, как это сделать

Tiptop 14.12.2020 09:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ВАШ ДФ

> df
# A tibble: 30 x 3
   i.x33.031 i.x35.034 days_incubated
       <dbl>     <dbl>          <dbl>
 1     13.6     0.123               4
 2      0       0                   4
 3    105.      0.0351              4
 4     29.0     0.0407              4
 5     26.1     0.0497              4
 6      4.11    0.0153              4
 7     62.1     0.0856              4
 8    137.      0.230               4
 9      0       0                   4
10    292.      0.386               4
# ... with 20 more rows

Используйте это только для округления

df %>% mutate(i.x33.031 = case_when(i.x33.031 > 10 ~ round(i.x33.031),
                                    i.x33.031 > 0 ~ round(i.x33.031, 1),
                                    i.x33.031 > 0.1 ~ round(i.x33.031, 2),
                                    i.x33.031 > 0.01 ~ round(i.x33.031, 3),
                                    TRUE ~ round(i.x33.031, 4)))
# A tibble: 30 x 3
   i.x33.031 i.x35.034 days_incubated
       <dbl>     <dbl>          <dbl>
 1      14      0.123               4
 2       0      0                   4
 3     105      0.0351              4
 4      29      0.0407              4
 5      26      0.0497              4
 6       4.1    0.0153              4
 7      62      0.0856              4
 8     137      0.230               4
 9       0      0                   4
10     292      0.386               4
# ... with 20 more rows

Округление обоих столбцов

result <- df %>% mutate_at(.funs = ~ case_when(. > 10 ~ round(.),
                                    . > 0 ~ round(., 1),
                                    . > 0.1 ~ round(., 2),
                                    . > 0.01 ~ round(., 3),
                                    TRUE ~ round(., 4)), .vars = 1:2)

> print(result)
# A tibble: 30 x 3
   i.x33.031 i.x35.034 days_incubated
       <dbl>     <dbl>          <dbl>
 1      14         0.1              4
 2       0         0                4
 3     105         0                4
 4      29         0                4
 5      26         0                4
 6       4.1       0                4
 7      62         0.1              4
 8     137         0.2              4
 9       0         0                4
10     292         0.4              4
# ... with 20 more rows

РЕДАКТИРОВАТЬ для печати, а также для округления

df %>% mutate_at(.funs = ~ case_when(. == 0 ~ formatC(0, format = "f", digits = 0),
                                     . < 0.01 ~ formatC(round(., 4), format = "f", digits = 4),
                                     . < 0.1 ~ formatC(round(., 3), format = "f", digits = 3),
                                     . < 1 ~ formatC(round(., 2), format = "f", digits = 2),
                                     . < 10 ~ formatC(round(., 1), format = "f", digits = 1),
                                     . >= 10 ~ formatC(round(., 0), format = "f", digits =0)), .vars = 1:2)

# A tibble: 30 x 3
   i.x33.031 i.x35.034 days_incubated
   <chr>     <chr>              <dbl>
 1 14        0.12                   4
 2 0         0                      4
 3 105       0.035                  4
 4 29        0.041                  4
 5 26        0.050                  4
 6 4.1       0.015                  4
 7 62        0.086                  4
 8 137       0.23                   4
 9 0         0                      4
10 292       0.39                   4
# ... with 20 more rows

ПРИМЕЧАНИЕ Mutate в последней части вашего канала/синтаксиса, то есть непосредственно перед печатью, предлагается, поскольку formatC преобразует все значения double в character

Да, именно @AnilGoyal, спасибо"! Тогда мне просто нужно применить его ко многим столбцам, желательно в зависимости от их положения в столбце.

Tiptop 14.12.2020 09:36

Возможно, я делаю что-то не так, однако результат, который я получаю, заключается в том, что все числа имеют 1 десятичный знак. Относится ли ".vars = 1:2) к номерам столбцов, которые следует округлить?

Tiptop 14.12.2020 10:18

.vars означает номера столбцов да. Вероятно, вы заботитесь об округлении, а также о печати результатов. Попробуйте код, который я добавил в своем ответе

AnilGoyal 14.12.2020 10:42

Другие вопросы по теме