Общим решением было бы применить функцию table
к каждому столбцу вашего фрейма. Обычно table
возвращает именованный вектор, но вам нужна более похожая на кадр презентация, поэтому мы увеличим ее с помощью as.data.frame.table
.
lst2 <- lapply(df, function(x) {
out <- as.data.frame.table(table(x))
out$Pct <- 100*out$Freq/sum(out$Freq)
out
})
# or code-golf:
# lapply(df, function(x) transform(as.data.frame.table(table(x)), Pct = 100*Freq/sum(Freq)))
lst2
# $group
# x Freq Pct
# 1 A 7 70
# 2 B 3 30
# $score
# x Freq Pct
# 1 N 4 40
# 2 Y 6 60
# $night
# x Freq Pct
# 1 1 5 50
# 2 2 3 30
# 3 3 2 20
# $ticket
# x Freq Pct
# 1 0 5 50
# 2 1 5 50
# $book
# x Freq Pct
# 1 0 4 40
# 2 1 6 60
# $gender
# x Freq Pct
# 1 Female 7 70
# 2 Male 3 30
# $course
# x Freq Pct
# 1 M 4 40
# 2 N 6 60
. Вы можете объединить все эти элементы с чем-то вроде :
do.call(rbind, c(Map(cbind, nm=names(lst2), lst2), list(make.row.names = FALSE)))
# nm x Freq Pct
# 1 group A 7 70
# 2 group B 3 30
# 3 score N 4 40
# 4 score Y 6 60
# 5 night 1 5 50
# 6 night 2 3 30
# 7 night 3 2 20
# 8 ticket 0 5 50
# 9 ticket 1 5 50
# 10 book 0 4 40
# 11 book 1 6 60
# 12 gender Female 7 70
# 13 gender Male 3 30
# 14 course M 4 40
# 15 course N 6 60
Отредактировано для удаления имен строк по умолчанию.