Я хотел бы получить приведенные ниже данные (под a) в формате с валютой и запятыми и отрицательными числами в скобках и с выравниванием по правому краю (под b и c). Также обратите внимание, что мне нужен символ валюты только для нескольких строк (имеющих стоимость в метках/именах строк)
(а) Выходной ток: -
Drug A vs P Drug A vs Q Drug A vs R Drug A vs S
Combined PP Difference 0.0903 0.0383 0.9933 0.0393
Medical Cost Difference (in $) -985.0988 -9999.5833 -5253.2836 -9603.5999
Total PP Cost Difference (in $) -5696.8688 -335.3333 5590.0962 9880.3909
YYL based on Med Cost ($/YYL) -93033.3368 -99065.8856 -59333.2590 -55263.3063
YYL based on Total Cost ($/YYL -535966.9930 -93933.5993 99238.5352 56583.9353
(b) Требуемый результат: -
Drug A vs P Drug A vs Q Drug A vs R Drug A vs S
Combined PP Difference 0.0903 0.0383 0.9933 0.0393
Medical Cost Difference (in $) (985.0988) (9999.5833) (5253.2836) -9603.5999
Total PP Cost Difference (in $) (5,696.8688) (335.3333) 5590.0962 9880.3909
YYL based on Med Cost ($/YYL) (93,033.3368) (99065.8856) (59333.2590) (55263.3063)
YYL based on Total Cost ($/YYL)(53,5966.9930) (93,933.5993) (99238.5352) 56583.9353
Более заслуженный/требуемый результат показан на (c). Тем не менее, «(b)» тоже в чем-то неплох.
(c) Требуемый результат: -
Drug A vs P Drug A vs Q Drug A vs R Drug A vs S
Combined PP Difference 0.0903 0.0383 0.9933 0.0393
Medical Cost Difference (in $) $(985.0988) $(9999.5833) $(5253.2836) -9603.5999
Total PP Difference (in $) $(5,696.8688) $(335.3333) $5590.0962 9880.3909
YYL based on Med Cost ($/YYL) $(93,033.3368)/YYL $(99065.8856)/YYL $(59333.2590)/YYL $(55263.3063)/YYL
YYL based on Total Cost ($/YYL) $(53,5966.9930)/YYL $(93,933.5993)/YYL $(99238.5352)/YYL $56583.9353/YYL
Обратите внимание, что мне не нужны "" (т.е. двойные/одиночные коды) перед знаком $, так как несколько кодов/функций, таких как доллар (x) и т. д. в R, присваивают "в начале и в конце чисел.
Я попробовал несколько кодов, но ни один из них не получает числа -ve в скобках, а вместо этого доллары идут с кодами "" и со всеми строками, кроме строк с номерами 2 и 3 (в приведенных ниже кодах я избавляюсь от "" в наименее). Ниже приведены несколько кодов, которые я пробовал: -
Определение таблицы результатов - общая разница в PP, общая разница в стоимости и YYL на основе медицинских расходов и общей стоимости
results.table = matrix(NA, nrow=5, ncol=4)
row.names(results.table) <- c("Combined PP Difference", "Medical Cost Difference (in $)", "Total PP Difference (in $)",
"YYL based on Med Cost ($/YYL)", "YYL based on Total Cost ($/YYL")
colnames(results.table) <- c(" Drug A vs P", " Drug A vs Q", " Drug A vs R", " Drug A vs S")
results.table[1,] <- INC.YYL[5,]
results.table[2,] <- INC.med.cost[5,]
results.table[3,] <- total.cost.diff[3,]
results.table[4,] <- INC.med.cost[5,]/INC.QALY[5,]
results.table[5,] <- total.cost.diff[3,]/INC.QALY[5,]
Печать таблицы результатов
round(results.table, 4)
Кроме того, приведенный ниже вариант нарушает выравнивание по правому краю и дает $ каждой строке (и я хочу, чтобы знак $ был только в строках 2 и 3).
library(formattable)
currency(results.table, symbol = "$", digits = 2)
Точно так же приведенный ниже код не обслуживает требуемое: -
library(formattable)
rt1 <- currency(results.table[1,], "", 4)
rt2 <- currency(results.table[2,], "$", 0)
rt3 <- currency(results.table[3,], "$", 0)
rt4 <- currency(results.table[4,], "", 0)
rt5 <- currency(results.table[5,], "", 0)
rbind(rt1, rt2, rt3, rt4, rt5)
Кроме того, было бы здорово, если бы я мог получить первую строку вывода с 4 десятичными знаками и все остальные строки без десятичных знаков.
Да, мне нужны запятые.
Вот способ отформатировать data.frame так, чтобы он выглядел так, как вам нужно.
library(dplyr)
df <- data.frame(`Drug A vs P` = c(0.0107,-252966.1950),
`Drug A vs Q` = c(0.0587,-13157.2915),
`Drug A vs R` = c(0.1137,-19438.2724),
`Drug A vs S` = c(0.0715,26285.9723),
row.names = c("Combined PP Difference","YYL based on Total Cost ($/YYL"),
stringsAsFactors = FALSE)
df2 <- df %>%
mutate( type = row.names(df)) %>%
mutate_if (is.numeric, funs(ifelse(. < 0 & type == "YYL based on Total Cost ($/YYL",
paste0("$(",.,")/YLL"),
ifelse(. < 0 & type = = "Combined PP Difference",
paste0("$(",.,")"), . ))))
colnames(df2) <- c('Drug A vs P','Drug A vs Q','Drug A vs R','Drug A vs S','type')
Сначала я сделал столбец rownames
, чтобы с ним было легче работать. Затем я отформатировал числовые переменные, если они были меньше 0, в соответствии с указанными выше спецификациями.
Мне удалось получить отрицательную скобку, но функция может добавлять или добавлять что-либо, надеюсь, это поможет,
library(dplyr)
neg_to_brac <- function(x, ..., prepend = "$", append = "/YYL") {
x <- formatC(x, ...)
idx <- grepl("-", x)
x[idx] <- paste0("(", gsub("-", "", x[idx]), ")")
paste0(prepend, x, append)
}
with_currency <- as.data.frame(results.table) %>%
tibble::rownames_to_column("Rows") %>%
mutate_at(-1, function(x) neg_to_brac(x, append = ""))
with_currency
Результат:
Rows Drug A vs P Drug A vs Q Drug A vs R Drug A vs S
1 Combined PP Difference $(1.272) $1.123 $(0.6018) $1.705
2 Medical Cost Difference (in $) $0.8326 $(0.1195) $(0.5047) $0.5463
3 Total PP Difference (in $) $(0.9378) $0.452 $0.6503 $(0.2779)
4 YYL based on Med Cost ($/YYL) $(0.5051) $(0.7621) $(0.02109) $1.533
5 YYL based on Total Cost ($/YYL $0.06244 $(0.1208) $0.4944 $1.614
Это довольно просто, используя sprintf
и ifelse
. Вы можете использовать две матрицы строк формата, чтобы задать каждой строке другой формат для положительных и отрицательных значений.
Обновлено: если вам нужны разделители-запятые в больших числах, вы можете использовать format
, но тогда вы работаете со строками, поэтому я думаю, что проще построить выходные матрицы построчно для положительных и отрицательных чисел отдельно.
# data
results.table <- matrix(2000*(runif (20)-runif (20)), nrow=5, ncol=4)
results.table[1,] <- results.table[1,] - round(results.table[1,], 0)
row.names(results.table) <- c("Combined PP Difference", "Medical Cost Difference (in $)", "Total PP Difference (in $)",
"YYL based on Med Cost ($/YYL)", "YYL based on Total Cost ($/YYL)")
colnames(results.table) <- c(" Drug A vs P", " Drug A vs Q", " Drug A vs R", " Drug A vs S")
# formatted for positive and negative
fp <- matrix(nrow=5, ncol=4)
fp[1,] <- sprintf("%s", format(round(results.table[1,], 4), big.mark = ",", scientific=FALSE, trim=TRUE))
fp[2:3,] <- sprintf("$%s", format(round(results.table[2:3,], 0), big.mark = ",", scientific=FALSE, trim=TRUE))
fp[4:5,] <- sprintf("$%s/YYL", format(round(results.table[4:5,], 0), big.mark = ",", scientific=FALSE, trim=TRUE))
fn <- matrix(nrow=5, ncol=4)
fn[1,] <- sprintf("(%s)", format(abs(round(results.table[1,], 4)), big.mark = ",", scientific=FALSE, trim=TRUE))
fn[2:3,] <- sprintf("$(%s)", format(abs(round(results.table[2:3,], 0)), big.mark = ",", scientific=FALSE, trim=TRUE))
fn[4:5,] <- sprintf("$(%s)/YYL", format(abs(round(results.table[4:5,], 0)), big.mark = ",", scientific=FALSE, trim=TRUE))
# formatted table
noquote(ifelse(results.table<0, fn, fp))
Drug A vs P Drug A vs Q Drug A vs R Drug A vs S
Combined PP Difference 0.1275 (0.4701) 0.2297 0.2005
Medical Cost Difference (in $) $472 $(141) $(927) $271
Total PP Difference (in $) $233 $(141) $891 $288
YYL based on Med Cost ($/YYL) $(1,425)/YYL $(160)/YYL $(759)/YYL $1,307/YYL
YYL based on Total Cost ($/YYL) $(377)/YYL $(1,222)/YYL $545/YYL $27/YYL
Created on 2019-04-12 by the reprex package (v0.2.1)
Отлично, не могли бы вы также добавить запятые (в '000), так как они мне действительно нужны, например, для вывод типа $(1504)/YYL более ценен, чем $(1504)/YYL?
Также я нашел интересную и простую комбинацию двух кодов, удовлетворяющую требованию вывода '(b)': -
library(formattable)
print(accounting(results.table, digits = 2, format = "f", big.mark = ","), right = T)
Выход: -
Drug A vs P Drug A vs Q Drug A vs R Drug A vs S
Combined PP Difference 2.27 2.26 2.77 2.27
Medical Cost Difference (in $) (782.22) (7,779.29) (2,822.88) (7,627.22)
Total PP Difference (in $) (2,696.87) (772.28) 2,272.22 7,882.29
YYL based on Med Cost ($/YYL) (77,272.26) (79,262.88) (27,222.82) (22,867.27)
YYL based on Total Cost ($/YYL) (222,966.79) (72,727.29) 79,828.27 26,282.97
Жаль, что эта функция не векторизована, поэтому вы можете отправить вектор/матрицу digits
. У меня была такая же проблема с round
.
вам нужны запятые в ваших числах?