Ubah urutan xtable sambil memformat jumlah digit

Saya memiliki kerangka data dengan 2 baris (pra/pasca perawatan) dan 11 kolom yang ingin saya tampilkan sebagai tabel 11x2. Berikut ini melakukan pekerjaan dengan baik:

print(xtable(t(df)))

Namun, saya tidak tahu cara mengontrol jumlah digit dan juga melakukan transpos. Apakah transpos post-xtable mungkin dilakukan?

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?

Saya juga mencoba melakukan transposisi sebelum membuat xtable, lalu mengubah digit untuk baris satu per satu, tetapi tidak berhasil juga, yaitu,

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

Tantangan umumnya adalah di tabel akhir saya memerlukan jumlah desimal yang berbeda di seluruh baris dalam kolom yang sama. Hal ini membuat saya berpikir bahwa beberapa versi pendekatan pertama mungkin diperlukan agar kontrol digit xtable standar dapat digunakan (yaitu, Kontrol jumlah tempat desimal pada output xtable di R)


person Bryan    schedule 08.02.2014    source sumber
comment
Dalam kasus seperti ini, saya mengonversi semuanya menjadi vektor karakter, baris demi baris, di mana saya dapat mengontrol jumlah digitnya.   -  person Roman Luštrik    schedule 08.02.2014
comment
Saya akan mengedit presentasi angka-angka dan mengubah urutan SEBELUM memaksa ke xtable. Coba gunakan round   -  person Brandon Bertelsen    schedule 08.02.2014
comment
@BrandonBertelsen apakah ada cara untuk melakukan ini semua dalam satu langkah seperti yang dilakukan dengan digits()?   -  person Bryan    schedule 08.02.2014


Jawaban (1)


Salah satu masalahnya adalah argumen 'digit' Anda terdiri dari 12 item. Menghapus awalan "0" memungkinkan peringatan dikurangi:

 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}

Fungsi transpose untuk matriks dan data.frame tampaknya menerapkan keseragaman kolom dengan lebar digit (atau mungkin itu adalah metode pencetakannya?

Inilah upaya yang sangat kludgy:

 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
Terima kasih, ini berhasil. Menariknya, argumen digits tampaknya berfungsi berbeda dalam contoh Anda dibandingkan dengan argumen xtable: untuk format, argumen tersebut sama dengan total # digit yang diinginkan, sedangkan untuk xtable, argumen tersebut sama dengan jumlah digit yang diinginkan di sebelah kanan koma desimal. - person Bryan; 09.02.2014
comment
Saya pikir ini memberikan jumlah minimum digit signifikan berdasarkan baris. - person IRTFM; 09.02.2014