Я пытаюсь показать «значащие цифры» моего набора данных. У меня есть набор данных как с высокими, так и с низкими числами, которые я хочу представить в таблице данных (под таблицей данных здесь я имею в виду цифру в документе, а не таблицу данных (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, я немного конкретизировал свой вопрос.
Разве вы не можете просто написать использовать некоторые операторы if для создания таблицы? для числа в списке: если число == (10^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, спасибо"! Тогда мне просто нужно применить его ко многим столбцам, желательно в зависимости от их положения в столбце.
Возможно, я делаю что-то не так, однако результат, который я получаю, заключается в том, что все числа имеют 1 десятичный знак. Относится ли ".vars = 1:2) к номерам столбцов, которые следует округлить?
.vars означает номера столбцов да. Вероятно, вы заботитесь об округлении, а также о печати результатов. Попробуйте код, который я добавил в своем ответе
каков ваш желаемый результат?