Recentemente ho scritto una funzione rapida a che fare con questi. Puoi facilmente modificarlo per aggiungere anche la proporzione delle risposte totali.
set.seed(1)
dat <- data.frame(resp = 1:10,
like1 = sample(0:1, 10, TRUE),
like2 = sample(0:1, 10, TRUE),
like3 = sample(0:1, 10, TRUE))
La funzione:
multi.freq.table = function(data, sep="", dropzero=FALSE, clean=TRUE) {
# Takes boolean multiple-response data and tabulates it according
# to the possible combinations of each variable.
#
# See: http://stackoverflow.com/q/11348391/1270695
counts = data.frame(table(data))
N = ncol(counts)
counts$Combn = apply(counts[-N] == 1, 1,
function(x) paste(names(counts[-N])[x],
collapse=sep))
if (isTRUE(dropzero)) {
counts = counts[counts$Freq != 0, ]
} else if (!isTRUE(dropzero)) {
counts = counts
}
if (isTRUE(clean)) {
counts = data.frame(Combn = counts$Combn, Freq = counts$Freq)
}
counts
}
applicare la funzione:
multi.freq.table(dat[-1], sep="-")
# Combn Freq
# 1 1
# 2 like1 2
# 3 like2 2
# 4 like1-like2 2
# 5 like3 1
# 6 like1-like3 1
# 7 like2-like3 0
# 8 like1-like2-like3 1
Spero che questo aiuti! Altrimenti, mostra alcuni esempi dell'output desiderato o descrivi alcune funzionalità, e vedrò cosa può essere aggiunto.
Aggiornamento
Dopo aver esaminato l'output di SPSS per questa linea, sembra che il seguente dovrebbe farlo per voi. Questo è abbastanza facile da avvolgere in una funzione se devi usarla molto.
data.frame(Freq = colSums(dat[-1]),
Pct.of.Resp = (colSums(dat[-1])/sum(dat[-1]))*100,
Pct.of.Cases = (colSums(dat[-1])/nrow(dat[-1]))*100)
# Freq Pct.of.Resp Pct.of.Cases
# like1 6 42.85714 60
# like2 5 35.71429 50
# like3 3 21.42857 30
Per chiunque si sia imbattuto in questo ora: ora c'è un pacchetto dedicato per questo, MCRV: https://journal.r-project.org/archive/2014-1/koziol-bilder.pdf (commento di @matherion) – Moritz