Не самый элегантный кусок кода ... Но он работает!
Данные
d <- structure(list(test = structure(c(2L, 1L, 2L, 1L, 2L, 1L, 2L,
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L), .Label = c("Postest",
"Pretest"), class = "factor"), var1 = structure(c(1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L,
1L), .Label = c("No", "Yes"), class = "factor"), var2 = structure(c(2L,
2L, 3L, 3L, 2L, 3L, 3L, 1L, 3L, 2L, 2L, 1L, 3L, 2L, 1L, 2L, 2L,
1L, 3L, 3L), .Label = c("No", "Sometimes", "Yes"), class = "factor"),
var3 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "No", class = "factor")), .Names = c("test",
"var1", "var2", "var3"), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14", "15", "16", "17", "18", "19", "20"))`
Решение
output <- NULL
for (t_cat in unique(d$test)) {
x <- d[d$test == t_cat, ]
x$test <- NULL
l <- lapply(x, function(x) {
output <- data.frame(table(x))
colnames(output) <- c('val', 'n')
output$rel.freq <- output$n/length(x)
output$category <- t_cat
return(output)
})
r <- do.call("rbind", lapply(names(l), function(x) { cbind(l[[x]], 'var' = x)}))
output <- rbind(output, r)
}
print(output)
# val n rel.freq category var
# 1 No 9 0.9 Pretest var1
# 2 Yes 1 0.1 Pretest var1
# 3 No 1 0.1 Pretest var2
# 4 Sometimes 4 0.4 Pretest var2
# 5 Yes 5 0.5 Pretest var2
# 6 No 10 1.0 Pretest var3
# 7 No 10 1.0 Postest var1
# 8 Yes 0 0.0 Postest var1
# 9 No 3 0.3 Postest var2
# 10 Sometimes 4 0.4 Postest var2
# 11 Yes 3 0.3 Postest var2
# 12 No 10 1.0 Postest var3