Как отформатировать таблицу данных или матрицу в R для требуемого символа валюты и отрицательных чисел в скобках "()" - PullRequest
1 голос
/ 09 апреля 2019

Я хотел бы получить приведенные ниже данные (под 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). Тем не менее, «(б)» также несколько хорошо.

(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 (в приведенных ниже кодах я избавляюсь от "" по крайней мере). Ниже приведены несколько кодов, которые я пробовал: -

Определение таблицы результатов - общая разница ПП, общая разница затрат и 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 десятичными знаками и все остальные строки без десятичных дробей.

Ответы [ 4 ]

1 голос
/ 11 апреля 2019

Кроме того, я нашел интересную и простую комбинацию двух кодов и отвечающую требованию к выводу '(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
1 голос
/ 11 апреля 2019

Это довольно легко, используя 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     

Создано в 2019-04-12 пакетом представ. (v0.2.1)

0 голосов
/ 09 апреля 2019

Мне удалось получить отрицательную скобку, но функция может добавлять или добавлять что-либо, надеюсь, это поможет,

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
0 голосов
/ 09 апреля 2019

Вот способ отформатировать 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 в соответствии с вашими требованиями выше.

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