2012-02-09 5 views
5

Dopo cbind o rbind -in un oggetto tabella (ad esempio, aggiungendo un margine di somme o somesuch), i nomi dei dimnames vengono persi (vedere). Ho trovato questa "soluzione alternativa", ma mi chiedevo se c'è una soluzione fuori dal pacchetto per questo che sembra meno hacky. Forse qualcosa che può essere fatto al volo? Vorrei mantenere l'oggetto della classe table.Perdita dei nomi dei dimnames di una tabella dopo cbind o rbind

> (x <- table(1:3, sample(1:3), dnn = c("rows", "cols"))) 
    cols 
rows 1 2 3 
    1 1 0 0 
    2 0 0 1 
    3 0 1 0 
> (y <- cbind(x, "4" = 4:6)) # "rows" and "cols" get lost 
    1 2 3 4 
1 1 0 0 4 
2 0 0 1 5 
3 0 1 0 6 
> names(dimnames(y)) <- names(dimnames(x)) 
> y 
    cols 
rows 1 2 3 4 
    1 1 0 0 4 
    2 0 0 1 5 
    3 0 1 0 6 
+0

Questo non fa nemmeno quello che vuoi, poiché "y" non è più class == "table". –

+0

E adesso? :) 'as.table (as.table (y))' –

risposta

3

Come su addmargins? Calcola somme per impostazione predefinita, ma è possibile collegare qualsiasi funzione personalizzata (s). Ad esempio:

> addmargins(x, margin=c(2,2), FUN=list('sum', 'mean')) 
Margins computed over dimensions 
in the following order: 
1: cols 
2: cols 
    cols 
rows 1 2 3 sum mean 
    1 0.0 1.0 0.0 1.0 0.5 
    2 0.0 0.0 1.0 1.0 0.5 
    3 1.0 0.0 0.0 1.0 0.5 
+0

Ho usato 'margin.table' ma non ho notato quanto sia utile' addmargins' (collegato da 'margin.table'). Grazie. Con una leggera modifica ('addmargins (x, margin = c (1,2), FUN = lista (total = 'sum'), quiet = TRUE)'), ottengo esattamente quello che volevo molto elegantemente. –

+0

La media tuttavia è calcolata sulle 3 colonne della tabella E sulla colonna della somma, quindi in pratica è sbagliato. C'è un modo per aggirare questo? – ivan

Problemi correlati