Объединение матрицы во фрейме данных через агрегат

Я пытаюсь вычислить квантили по фактору и распечатать полученный агрегат в формате латекса, используя xtable. К сожалению, я получаю некоторое шаткое поведение. И чистое решение будет оценено.

Чтобы создать пример:

tm <- data.frame(f=c("a","b","c"),v=runif(30))
tm$f <- factor(tm$f)
agv <- aggregate(v~f,tm, quantile)

Вывод agv не принимается xtable:

xtable(agv)

дает

Ошибка в cols[, i + pos] ‹- do.call("formatC", curFormatArgs): количество заменяемых элементов не кратно длине замены

хотя print(agv) есть

  f        v.0%       v.25%       v.50%       v.75%      v.100%
1 1 0.002970944 0.253247687 0.571891610 0.766606825 0.986142807
2 2 0.002129951 0.328739086 0.558132094 0.799115979 0.991067470
3 3 0.011059184 0.285322522 0.496035672 0.770908599 0.994420787

потому что очевидно dim(agv) на самом деле [1] 3 2

Итак, я попытался:

cbind(featureName=agv$f, agv$v)

что по какой-то причине приводит к тому, что коэффициенты символов преобразуются в числовые значения.

После некоторых проб и ошибок я остановился на этом решении:

cbind(f=as.character(agv$f), data.frame(agv$v,check.names=F))

что дает мне результат, который я хочу в xtable:

\begin{table}[ht]
\centering
\begin{tabular}{rlrrrrr}
  \hline
 & f & 0\% & 25\% & 50\% & 75\% & 100\% \\
  \hline
1 & a & 0.00 & 0.25 & 0.48 & 0.75 & 0.99 \\
  2 & b & 0.00 & 0.28 & 0.46 & 0.74 & 1.00 \\
  3 & c & 0.02 & 0.21 & 0.44 & 0.63 & 1.00 \\
   \hline
\end{tabular}
\end{table}

Во всяком случае, мне просто любопытно, есть ли более чистое решение с меньшим количеством задействованных строк.


person JasonMond    schedule 25.04.2013    source источник


Ответы (1)


Немного более прямой подход (хотя концептуально не сильно отличающийся от того, что вы уже сделали) может заключаться в использовании do.call(data.frame, ...). Следующее работает для меня.

xtable(do.call(data.frame, c(agv, check.names = FALSE)))

Для меня это возвращает:

> xtable(do.call(data.frame, c(agv, check.names = FALSE)))
% latex table generated in R 3.0.0 by xtable 1.7-1 package
% Thu Apr 25 11:10:26 2013
\begin{table}[ht]
\centering
\begin{tabular}{rlrrrrr}
  \hline
 & f & v.0\% & v.25\% & v.50\% & v.75\% & v.100\% \\ 
  \hline
1 & a & 0.06 & 0.27 & 0.38 & 0.64 & 0.94 \\ 
  2 & b & 0.20 & 0.38 & 0.52 & 0.70 & 0.87 \\ 
  3 & c & 0.01 & 0.22 & 0.60 & 0.87 & 0.99 \\ 
   \hline
\end{tabular}
\end{table}

xtable также работает с data.tables, поэтому вы также можете сделать что-то вроде следующего:

library(data.table)

DT <- data.table(tm, key = "f")
xtable(DT[, as.list(quantile(v)), by = key(DT)])

Здесь DT[, as.list(quantile(v)), by = key(DT)] даст вам те же результаты, что и ваш объект "agv".

person A5C1D2H2I1M1N2O1R2T1    schedule 25.04.2013