Транспонировать xtable при форматировании количества цифр

У меня есть фрейм данных с 2 строками (до/после обработки) и 11 столбцами, которые я хочу отобразить в виде таблицы 11x2. Следующее делает работу хорошо:

print(xtable(t(df)))

Однако я не могу понять, как контролировать количество цифр, а также выполнять транспонирование. Возможна ли транспонирование post-xtable?

df <- xtable(df)
digits(df) <- c(0,0,0,1,0,1,2,0,1,0,0,2)
t(df) # Does not work; is a post-xtable transpose possible?

Я также пытался транспонировать перед созданием xtable, а затем менять цифры для строк по отдельности, но не смог заставить это работать, т.е.

df <-xtable(t(df)) # works as intended
digits(df[10,]) <- c(0,1,1) # no error, but does nothing

Общая проблема заключается в том, что в итоговой таблице мне нужно разное количество десятичных знаков в строках одного столбца. Это заставляет меня думать, что, вероятно, потребуется некоторая версия первого подхода, чтобы можно было использовать стандартные элементы управления цифрами xtable (т. е. Управление количеством знаков после запятой в выводе xtable в R)


person Bryan    schedule 08.02.2014    source источник
comment
В таких случаях я преобразую все в векторы символов, строку за строкой, где я могу контролировать количество цифр.   -  person Roman Luštrik    schedule 08.02.2014
comment
Я бы отредактировал представление чисел и перенес ДО принуждения к xtable. Попробуйте использовать round   -  person Brandon Bertelsen    schedule 08.02.2014
comment
@BrandonBertelsen, есть ли способ сделать все это за один шаг, как с digits()?   -  person Bryan    schedule 08.02.2014


Ответы (1)


Одна проблема заключается в том, что ваш аргумент «цифры» состоит из 12 элементов. Удаление ведущего «0» позволяет уменьшить количество предупреждений:

 df <- as.data.frame(matrix(rnorm(22), nrow=2))
 print(xtable(t( mapply("format", df, digits=c(0,0,1,0,1,2,0,1,0,0,2)))))

% latex table generated in R 3.0.2 by xtable 1.7-1 package
% Sat Feb  8 11:37:06 2014
\begin{table}[ht]
\centering
\begin{tabular}{rll}
  \hline
 & 1 & 2 \\ 
  \hline
V1 & 0 & 0 \\ 
  V2 & 0 & 1 \\ 
  V3 &  2.1 & -0.5 \\ 
  V4 & -2 &  1 \\ 
  V5 & -0.7 & -0.7 \\ 
  V6 &  1.03 & -0.28 \\ 
  V7 & -1 &  0 \\ 
  V8 & -0.139 &  0.006 \\ 
  V9 &  0 & -0 \\ 
  V10 &  1 & -0 \\ 
  V11 & 0.33 & 1.10 \\ 
   \hline
\end{tabular}
\end{table}

Функции транспонирования для матриц и data.frames, по-видимому, обеспечивают единообразие столбцов ширины цифр (или, возможно, это их методы печати?

Вот действительно неуклюжая попытка:

 capture.output(apply(cbind(t(df), digits), 1, function(x) 
                                            cat( c(round( x[1:2], x[3]) ,"\n") ) )  )
 [1] "0 0 "        "0 1 "        "2.1 -0.5 "   "-2 1 "       "-0.7 -0.7 " 
 [6] "1.03 -0.28 " "-1 0 "       "-0.1 0 "     "0 0 "        "1 0 "       
[11] "0.33 1.1 "   "NULL"   
person IRTFM    schedule 08.02.2014
comment
Спасибо, это помогает. Интересно, однако, что аргумент digits в вашем примере работает иначе, чем для xtable: для формата он равен общему количеству желаемых цифр, тогда как для xtable он равен желаемому количеству цифр справа от десятичной точки. - person Bryan; 09.02.2014
comment
Я думаю, что это дает минимальное количество значащих цифр на основе строк. - person IRTFM; 09.02.2014