Вы в основном составляете таблицы и вычисляете пропорции на основе таблиц, поэтому, вероятно, лучше придерживаться table
и prop.table
. Вот пример функции, с которой можно начать:
myFun <- function(input, id, measure, display = FALSE) {
x <- melt(as.data.table(input), id.vars = id, measure.vars = measure)
x <- x[(value), table(variable, get(id))]
y <- prop.table(x, 1) * 100
if (display) {
x[] <- sprintf("%s (%02.f%%)", x, y)
as.data.frame.matrix(x)
} else {
list(x, y)
}
}
Функцию можно использовать следующим образом:
myFun(mydf, "age_group", c("cond_a", "cond_b", "cond_c"))
## [[1]]
##
## variable 0-2 3-60 60+
## cond_a 1 2 0
## cond_b 1 0 2
## cond_c 2 1 0
##
## [[2]]
##
## variable 0-2 3-60 60+
## cond_a 33.33333 66.66667 0.00000
## cond_b 33.33333 0.00000 66.66667
## cond_c 66.66667 33.33333 0.00000
##
Или вы можете установить display = TRUE
и получить следующее:
myFun(mydf, "age_group", c("cond_a", "cond_b", "cond_c"), display = TRUE)
## 0-2 3-60 60+
## cond_a 1 (33%) 2 (67%) 0 (00%)
## cond_b 1 (33%) 0 (00%) 2 (67%)
## cond_c 2 (67%) 1 (33%) 0 (00%)
Вот примеры данных, которые я использовал:
mydf <- structure(list(age = c(0L, 7L, 42L, 0L, 0L, 3L, 64L, 70L, 4L,
24L), age_group = c("0-2", "3-60", "3-60", "0-2", "0-2", "3-60",
"60+", "60+", "3-60", "3-60"), cond_a = c(FALSE, FALSE, TRUE,
FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE), cond_b = c(TRUE,
FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE),
cond_c = c(FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE,
FALSE, FALSE, TRUE)), row.names = c("1", "2", "3", "4", "5",
"6", "7", "8", "9", "10"), class = "data.frame")
В идеале «display
» не было бы аргументом функции, а скорее, вы бы создали другой метод print
. Таким образом, значения по-прежнему доступны в list
, хотя то, что печатается на экране, может быть отформатировано по-другому.
Если вы делаете это для печати, вы можете посмотреть в пакет tables
. Вот подход, который я бы использовал в этом случае:
library(data.table)
library(tables)
DT <- melt(as.data.table(mydf), measure.vars = patterns("cond"))[(value)]
tabular((variable) ~ (Group = factor(age_group)) * ((n = 1) +
Percent("row")) * Format(digits = 1), data = DT)
##
## Group
## 0-2 3-60 60+
## variable n Percent n Percent n Percent
## cond_a 1 33 2 67 0 0
## cond_b 1 33 0 0 2 67
## cond_c 2 67 1 33 0 0