2015-06-12 2 views
0

Рассмотрим следующий пример:Как применять весы :: процентов или весы :: percent_format() для prop.table в R для форматирования чисел как проценты

tab <- table(mtcars$vs, mtcars$cyl, dnn = c("vs", "cylinder")) 
prop.table(tab) 
# cylinder 
# vs  4  6  8 
# 0 0.03125 0.09375 0.43750 
# 1 0.31250 0.12500 0.00000 

round(prop.table(tab)*100, 1) 
# cylinder 
# vs  4 6 8 
# 0 3.1 9.4 43.8 
# 1 31.2 12.5 0.0 

Желаемый результат:

# cylinder 
# vs  4  6  8 
# 0 3.1% 9.4% 43.8% 
# 1 31.2% 12.5% 0.0% 

scales::percent(round(prop.table(tab)))не Работает, потому что нет применимого метода для plyr::round_any(), применяемого к объекту класса table.

Я знаю, что мне не хватает простого обходного пути. Или, может быть, простая обертка или запрос на растяжение до plyr::round_any() могут исправить это для всех?

+0

'г <- раунд (prop.table (tab) * 100, 1) 'и' paste (d, "%", sep = "") '? – rmuc8

+0

@ rmuc8 Нет. Это выведет вектор. – JasonAizkalns

+0

'x <- paste (d,"% ", sep =" ")' 'matrix (x, nrow = 2, ncol = 3)' – rmuc8

ответ

4
pt <- percent(c(round(prop.table(tab), 3))) 
dim(pt) <- dim(tab) 
dimnames(pt) <- dimnames(tab) 

Это должно сработать. c используется для его свойства превращения таблицы или матрицы в вектор.

Альтернатива использованием sprintf:

pt <- sprintf("%0.1f%%", prop.table(tab) * 100) 
dim(pt) <- dim(tab) 
dimnames(pt) <- dimnames(tab) 

Если вы хотите таблицу написанную без кавычек, то вы могли бы использовать, например:

print(pt, quote = FALSE, right = TRUE) 
+0

Закрыть, но есть значения вокруг значений. – JasonAizkalns

+2

Это как раз то, как 'print' выводит символьные векторы и матрицы. Как добавлено выше, вы можете просто использовать опцию 'quote = FALSE', если это необходимо. –

+0

Заключительный шаг, выравнивание по правому краю и выравнивание десятичных знаков. – JasonAizkalns

1
prop <- round(prop.table(tab)*100, 1) 
x <- paste(prop, "%", sep="") 
print(matrix(x, nrow = 2, ncol = 3), quote = FALSE) 

#  [,1] [,2] [,3] 
# [1,] 3.1% 9.4% 43.8% 
# [2,] 31.2% 12.5% 0% 
+0

Как насчет выравнивания по правому краю и выровненных десятичных знаков? – JasonAizkalns

+0

просто добавьте 'right = TRUE'. Вы могли бы найти это в течение нескольких минут самостоятельно – rmuc8