2012-02-09 4 views
5

После cbind или rbind -в табличном объекте (например, добавлении разницы сумм или некоторого количества), имена dimnames теряются (см. y). Я нашел это «обходное решение», но задавался вопросом, есть ли из-за этого решение сумки, которое выглядит менее взломанным. Возможно, что-то, что можно сделать «на лету»? Я хотел бы сохранить объект класса table.Потеря имен уменьшенных имен таблицы после cbind или 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

Это даже не делает то, что вы хотите, так как «y» уже не является классом «таблица». –

+0

Что теперь? :) 'as.table (as.table (y))' –

ответ

3

Как насчет addmargins? Он вычисляет суммы по умолчанию, но вы можете подключать любые пользовательские функции. Например:

> 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

Я использую 'margin.table', но не заметил, насколько действительно полезен' addmargins' (связанный с 'margin.table'). Спасибо. С небольшой модификацией ('addmargins (x, margin = c (1,2), FUN = list (total = 'sum'), quiet = TRUE)'), я получаю именно то, что я хотел очень элегантно. –

+0

Среднее значение, однако, вычисляется по 3 столбцам таблицы и столбцу суммы, поэтому практически говоря неправильно. Есть ли способ обойти это? – ivan