2015-09-03 5 views
7

C'è un modo per stampare piccoli data.frames nella console in un modo più leggibile?Stampa bei data.frames/tabelle per console

Per esempio, sarebbe possibile per l'output alla console:

library(MASS) 
iris[1:5, ] 

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1   5.1   3.5   1.4   0.2 setosa 
2   4.9   3.0   1.4   0.2 setosa 
3   4.7   3.2   1.3   0.2 setosa 
4   4.6   3.1   1.5   0.2 setosa 
5   5.0   3.6   1.4   0.2 setosa 

come

iris[1:5, ] 

    +--------------+-------------+--------------+-------------+---------+ 
    | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | 
    +--------------+-------------+--------------+-------------+---------+ 
1 |   5.1 |   3.5 |   1.4 |   0.2 | setosa | 
2 |   4.9 |   3.0 |   1.4 |   0.2 | setosa | 
3 |   4.7 |   3.2 |   1.3 |   0.2 | setosa | 
4 |   4.6 |   3.1 |   1.5 |   0.2 | setosa | 
5 |   5.0 |   3.6 |   1.4 |   0.2 | setosa | 
    +--------------+-------------+--------------+-------------+---------+ 

mi rendo conto per la grande data.frames ci vorrebbe una quantità inutile di tempo, ma se si tratta di un'opzione, mi piacerebbe essere in grado di guardare i piccoli frame in modo più strutturato.

In particolare, quando ho due campi di testo uno accanto all'altro, sarebbe molto più semplice con una pipe tra i due campi per separarli, poiché la spaziatura tra le parole ha le stesse dimensioni della spaziatura tra le colonne.

Grazie

+2

Come su 'Vista (iris [1: 5,])'? –

+0

Hai provato il pacchetto 'dplyr'? Ha la funzione 'tbl_df' per convertire in quello che Hadley Wickham chiama un data.frame locale. Si suppone di (e lo fa, IMO) fornire un output più strutturato e leggibile quando si stampa su console. Tuttavia non fornisce separatori tra i campi. – misspelled

+0

Sì, li ho usati entrambi. E mi piacerebbe che stampasse la console perché ho bisogno di modificare interattivamente alcuni valori tra due tabelle che implicano un'interpretazione del testo per ~ 250 valori, quindi sto solo cercando di renderlo un po 'più facile da gestire. Sto anche usando 'data.table' per la maggior parte - l'output di cui trovo preferibile a' dplyr''s. –

risposta

12

In caso aiuta nessuno, ho appena imbattuto il fatto che knitr s' kable raggiunge un bel abbastanza di stampa. Combinando con alcuni dei suggerimenti .Rprofile sopra, questo sembra ottenere ciò che avevo in mente.

> knitr::kable(head(iris)) 

| Sepal.Length| Sepal.Width| Petal.Length| Petal.Width|Species | 
|------------:|-----------:|------------:|-----------:|:-------| 
|   5.1|   3.5|   1.4|   0.2|setosa | 
|   4.9|   3.0|   1.4|   0.2|setosa | 
|   4.7|   3.2|   1.3|   0.2|setosa | 
|   4.6|   3.1|   1.5|   0.2|setosa | 
|   5.0|   3.6|   1.4|   0.2|setosa | 
|   5.4|   3.9|   1.7|   0.4|setosa | 
+0

A partire da knitr 1.16, questo non è più il caso (cioè non è più una bella stampa). @yihui - qualche idea? – Shantanu

+0

@Shantanu Lavora per me con knitr_1.17 – G5W

+0

@ G5W Grazie per aver segnalato. Mi sono reso conto che il problema è qualcosa legato ai frammenti di Rmd. In RStudio, crea un nuovo file Rmd, esegui un chunk (qualsiasi chunk), quindi esegui 'knitr :: kable (head (iris))'. L'output ora non sembra pulito (ad esempio include 'attr (," format ")' 'attr (," class ")' 'attr (," knit_cacheable ")' ecc.) – Shantanu

3

Ci sono un paio di metodi da provare.

  1. Aggiungi un paio di funzioni di supporto al tuo .Rprofile. Nel mio profilo, ho

    hh = function(d) 
        if(class(d)=="matrix"|class(d)=="data.frame") d[1:5,1:5] 
    

    Questa funzione stampa l'angolo in alto a sinistra del frame di dati. Ho anche

    ht = function(d, n=6) rbind(head(d, n), tail(d,n)) 
    
  2. creare la propria funzione S3 stampa per frame di dati, per esempio

    print.data.frame = function(x, ..., digits = NULL, 
             quote = FALSE, right = TRUE, 
             row.names = TRUE) 
            message("hi") 
    
  3. Utilizzare un pacchetto, ad es. dplyr. Tuttavia, questo è un po 'eccessivo se tutto quello che vuoi è una bella stampa.

+0

Tutto ciò che voglio è una bella stampa. Gli oggetti sono comunque 'data.tables ', quindi vengono stampati come' 5 head', '5 tail' rows. Grazie per la parola chiave 'pretty' però. Sembra un titolo più appropriato. –

+1

Se si desidera stampare bene, quindi creare la funzione chiamata 'print.data.table'. Quando una tabella di dati viene stampata sullo schermo, tale funzione verrà eseguita. – csgillespie

1

Ho avuto lo stesso problema da poco e mi sono imbattuto il pacchetto huxtable. È molto flessibile e forse un po 'eccessivo per l'uscita della console, ma mi è servito molto bene.

Ecco come si potrebbe risolvere il problema utilizzando huxtable:

library(huxtable) 
library(magrittr) 

small_iris <- iris[1:5, ] 

iris_hux <- 
    hux(small_iris) %>% 
    add_colnames() %>% 
    set_bold(row = 1, col = everywhere, value = TRUE) %>% 
    set_all_borders(TRUE) 

penso che tutte le funzioni parlano da soli. Per un'introduzione approfondita, vedere https://hughjonesd.github.io/huxtable/huxtable.html#adding-row-and-column-names.

print_screen(iris_hux) resa questa uscita (nella console!):

enter image description here

non ho ancora capito come sopprimere le informazioni di fondo sui nomi delle colonne. Quindi se qualcuno lo sa, per favore commenta!

EDIT: Al fine di sopprimere i nomi di colonna in basso, utilizzare colnames = FALSE all'interno print_screen().

0

Se si è anche aperti alla stampa dell'output nel pannello di visualizzazione (RStudio) anziché nella console, si consiglia di utilizzare il pacchetto DT.

library(DT) 
datatable(iris) 

Questo ha diversi vantaggi, penso: l'uscita è bella e ben organizzato, il pacchetto è in grado di visualizzare i frame di dati di grandi dimensioni senza diventare ingombrante, ed è altamente personalizzabile per l'avvio.

enter image description here