2012-02-09 8 views
5

Después cbind o rbind -ing un objeto de tabla (por ejemplo, la adición de un margen de sumas o algo por el estilo), los nombres de dimnames se pierden (ver y). Encontré esta "solución alternativa" pero me preguntaba si hay una solución lista para esto que se vea menos hacky. Tal vez algo que se puede hacer sobre la marcha? Me gustaría mantener el objeto de la clase table.nombres perdedor de dimnames de una mesa después de 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

Eso ni siquiera hace lo que quiere, ya que "y" ya no es clase == "tabla". –

+0

¿Y ahora? :) 'as.table (as.table (y))' –

Respuesta

3

¿Qué tal addmargins? Calcula sumas por defecto, pero puede conectar cualquier función personalizada. Por ejemplo:

> 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

He estado usando 'margin.table' pero no he notado qué tan útil' addmargins' (vinculado desde 'margin.table') es realmente. Gracias. Con una ligera modificación ('addmargins (x, margin = c (1,2), FUN = list (total = 'suma'), quiet = TRUE)'), obtengo exactamente lo que quería con mucha elegancia. –

+0

Sin embargo, la media se calcula sobre las 3 columnas de la tabla Y la columna de suma, por lo que, en términos prácticos, es incorrecta. ¿Hay alguna forma de evitar esto? – ivan

Cuestiones relacionadas