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

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

вам нужны запятые в ваших числах?

Mike 09.04.2019 17:50

Да, мне нужны запятые.

Mr. A 11.04.2019 20: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
2
242
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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?

Mr. A 11.04.2019 20:20

Также я нашел интересную и простую комбинацию двух кодов, удовлетворяющую требованию вывода '(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.

Simon Woodward 11.04.2019 22:52

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