Добавление знака% в выводе prop.table

Я пытаюсь добавить знак % в вывод prop.table для использования в Sweave. Мой код попытки ниже:

m <- matrix(1:4,2)
dimnames(m) <- list(c("A", "B"), c("C", "D"))
prop.table(m,1)*100

         C        D
A 25.00000 75.00000
B 33.33333 66.66667


paste(round(prop.table(m,1)*100, 3), "%", sep = "")
[1] "25%"     "33.333%" "75%"     "66.667%"


paste(sprintf("%.1f", prop.table(m,1)*100), "%", sep = "")
[1] "25.0%" "33.3%" "75.0%" "66.7%"

Использование paste изменит класс с матрицы на символ. Я был бы очень признателен, если бы кто-нибудь помог мне найти правильное решение. Спасибо


person MYaseen208    schedule 07.02.2012    source источник


Ответы (4)


Большинство функций, предназначенных для работы с векторами, также принимают матрицы, но возвращают вектор вместо матрицы: paste, sprintf и т. д. Вы можете использовать apply, который вернет матрицу.

apply( 
  prop.table(m,1)*100, 
  2, 
  function(u) sprintf( "%.1f%%", u ) 
)
person Vincent Zoonekynd    schedule 07.02.2012
comment
(+1): Спасибо, @Vincent. Это то, что я искал. Есть ли у вас какая-либо функция, которая позволит добавлять частоты ячеек, а также проценты ячеек в одной и той же таблице ячеек для Sweave? В любом случае спасибо за ваш полезный ответ. - person MYaseen208; 08.02.2012
comment
Вы можете объединить две матрицы с помощью mapply и явно преобразовать результирующий вектор в матрицу: m1 <- apply(m, 2, as.character); m2 <- apply(prop.table(m,1)*100, 2, function(u) sprintf("%.1f%%", u)); m3 <- mapply(paste, m1, " (", m2, ")", sep=""); m3 <- matrix(m3, nr=nrow(m)); m3. Однако, чтобы сохранить выравнивание в таблице, я бы, вероятно, использовал цикл для явного написания кода LaTeX для таблицы. - person Vincent Zoonekynd; 08.02.2012

Другим решением может быть замена содержимого матрицы:

m2 <- m
m2[] <- sprintf("%.1f%%",round(prop.table(m,1)*100, 3))
m2
#   C       D      
# A "25.0%" "75.0%"
# B "33.3%" "66.7%"
person Marek    schedule 07.02.2012
comment
Хорошее решение. Можно получить такое же решение и с помощью этого m2[] <- sprintf("%.1f%%",prop.table(m,1)*100). Спасибо - person MYaseen208; 08.02.2012
comment
Или даже replace(m, TRUE, sprintf("%.1f%%",prop.table(m,1)*100)) - person G. Grothendieck; 08.02.2012
comment
@ G.Grothendieck Я забыл об этой функции. И replace(m, , sprintf("%.1f%%",prop.table(m,1)*100)) тоже работает. - person Marek; 09.02.2012

Существует пакет под названием janitor, который решает проблему prop.table() "форматирования в процентах". Вот ссылка на пакет: https://github.com/sfirke/janitor

Вот пример использования со страницы github.

roster %>%
  tabyl(employee_status, full_time) %>%
  adorn_totals("row") %>%
  adorn_percentages("row") %>%
  adorn_pct_formatting() %>%
  adorn_ns() %>%
  adorn_title("combined")
#>  employee_status/full_time         No        Yes
#>             Administration   0.0% (0) 100.0% (1)
#>                      Coach 100.0% (2)   0.0% (0)
#>                    Teacher  33.3% (3)  66.7% (6)
#>                      Total  41.7% (5)  58.3% (7)
person Matt Dancho    schedule 27.06.2018

Это расширение ответа от @VincentZoonekynd, которое добавляет поля (итого для строк/столбцов) и удаляет двойные кавычки:

library(magrittr)

m %>%
  prop.table %>%
  addmargins %>%
  apply(MARGIN=2, FUN=scales::percent, accuracy=0.1) %>%
  noquote

#>     C     D     Sum   
#> A   10.0% 30.0% 40.0% 
#> B   20.0% 40.0% 60.0% 
#> Sum 30.0% 70.0% 100.0%
person dnlbrky    schedule 18.04.2020