Пакет таблиц хорош для компактного описания такого вывода. Сначала создайте функции, которые вычисляют статистику, показанную в столбцах. Затем используйте указанную формулу tabular
. LHS - это строки, а RHS - это столбцы. + означает объединение переменных, описанных по обе стороны от +.
Вывод sprintf
может быть изменен, например, путем изменения строки формата. Смотри ?sprintf
.
Латекс
Также, если tab
является выводом команды tabular
, тогда latex(tab)
создаст версию для латекса, и вы можете изменить ее, вставив команды для латекса. Например, "%d \\tiny{(%d)}"
в качестве строки формата sprintf
уменьшит часть в скобках в выводе латекса.
HTML
Если вы хотите выводить html
, тогда с tab
, как только что определено, тогда html(tab)
создает HTML-версию, которая может быть изменена в дальнейшем с помощью соответствующих HTML-тегов. Например, "%d <small>(%d)</small>"
в качестве строки формата sprintf
уменьшит часть в скобках в выводе html.
ввод
Мы предоставляем ввод dat
в воспроизводимой форме в примечании в конце. В следующий раз убедитесь, что ввод предоставлен в воспроизводимой форме.
код
Это в основном воспроизводит вывод, показанный в вопросе, и намного более компактен, чем код там.
library(tables)
outstring <- function(x) if (length(x)) sprintf("%d (%d)", length(x), sum(x)) else 0
`<5` <- function(x) outstring(x[x < 5])
`5-10` <- function(x) outstring(x[x >= 5 & x <= 10])
`>10` <- function(x) outstring(x[x > 10])
tab <-
tabular(Date * (1 + Type) ~ (n=1) + Value * (`<5` + `5-10` + `>10` + sum), data = dat)
дает:
Value
Date n <5 5-10 >10 sum
2018-01-01 All 3 1 (4) 1 (7) 1 (12) 23
Type A 1 1 (4) 0 0 4
B 1 0 1 (7) 0 7
C 1 0 0 1 (12) 12
2018-01-02 All 4 1 (4) 2 (16) 1 (15) 35
Type A 2 1 (4) 1 (6) 0 10
B 2 0 1 (10) 1 (15) 25
C 0 0 0 0 0
Примечание
dat <-
structure(list(ID = structure(1:7, .Label = c("K-1", "K-2", "K-3",
"K-4", "K-5", "K-6", "K-7"), class = "factor"), Date = structure(c(1L,
1L, 1L, 2L, 2L, 2L, 2L), .Label = c("2018-01-01", "2018-01-02"
), class = "factor"), Type = structure(c(1L, 2L, 3L, 1L, 1L,
2L, 2L), .Label = c("A", "B", "C"), class = "factor"), Value = c(4L,
7L, 12L, 6L, 4L, 15L, 10L)), class = "data.frame", row.names = c(NA,
-7L))
Обновление
Класс tabular
имеет метод as.matrix, и мы можем выполнить простые манипуляции с ним для получения следующего вывода:
m <- as.matrix(tab)
m2 <- cbind(paste0(m[, 1], sub("All", "", m[, 3])), m[, -(1:3)])[-1, ]
setNames(as.data.frame(m2[-1, ]), m2[1, ])
дает:
Date n <5 5-10 >10 sum
1 2018-01-01 3 1 (4) 1 (7) 1 (12) 23
2 A 1 1 (4) 0 0 4
3 B 1 0 1 (7) 0 7
4 C 1 0 0 1 (12) 12
5 2018-01-02 4 1 (4) 2 (16) 1 (15) 35
6 A 2 1 (4) 1 (6) 0 10
7 B 2 0 1 (10) 1 (15) 25
8 C 0 0 0 0 0