2013-02-18 19 views
7

Ho un frame di dati R con nomi di colonne lunghi. Quindi quando stampo il frame dei dati è troppo largo. C'è un modo semplice per stampare il frame dei dati sullo schermo con i nomi dei file che appaiono su più righe?Stampa frame dati R con nomi di colonne su più righe

So che posso abbreviare i nomi, ma vorrei non farlo.

+0

Non penso che ci sia un modo per farlo. Potrei pentirmi per aver scritto questo (dato che tutto sembra possibile in R). – Arun

+1

È certamente possibile, ma ci sono una varietà di impostazioni predefinite che creano seri ostacoli. Avrei bisogno di vedere un caso d'uso convincente presentato (o una generosità davvero grande) per continuare le ricerche e il lavoro preliminare che ho già sprecato, er, speso. –

+1

crea nomi di colonne più brevi. – N8TRO

risposta

2

Quando la risposta di Oscar è stata accettata, ho pensato che potesse effettivamente essere stata una risposta. Sfortunatamente tutto ciò che stava accadendo era copiare il codice da format.daa.frame e dire "fai qualche magia non specificata qui". Ecco un codice che in realtà fa qualcosa, anche se l'ho considerato troppo difficile da pubblicare in quel momento. Stampa ancora le intestazioni di righe e colonne di matrice. Non so come sopprimerlo. Forse hai bisogno di un metodo di stampa hacked per le matrici?

dfrm <- data.frame(reallly_long.nameeeeeeeeeeeeeeeeeeeeeeee=letters[1:5], 
        secondreallly_long.nameeeeeeeeeeeeeeeeeeeeeeee=letters[1:5], short=2) 

pdfrm <- function(dfrm) { # first print the names broken into sections 
     print( unname(t(sapply(1:(max(nchar(names(dfrm))) %/% 12), 
        # first construct break points to be passed to `substr` 
      function(rr) sapply(names(dfrm), 
         substr, 1+(rr-1)*10, 9+(rr-1)*10)))) ,quote=FALSE, 
        # then print with sufficient gap 
       print.gap=8) 
        # Now print a headerless data.frame with wider spacing 
     print(setNames(dfrm, rep(" ", length(dfrm))), print.gap = 15 )} 
pdfrm(dfrm) 
#------------------------------ 
      [,1]    [,2]    [,3] 
[1,]  reallly_l  secondrea  short 
[2,]  ng.nameee  lly_long.    
[3,]  eeeeeeeee  ameeeeeee    

1    a    a    2 
2    b    b    2 
3    c    c    2 
4    d    d    2 
5    e    e    2 
2

Si potrebbe creare una funzione personalizzata format.data.frame, con modifiche nel comportamento quando R ritrova nomi "lunghi":

long <- nchar(cn, "bytes") > 256L 
cn[long] <- paste(substr(cn[long], 1L, 250L), "...") 
names(rval) <- cn 

E poiché dataframes vengono stampati come matrici dopo tutto quello che di pre-elaborazione, lascia la speranza che print.default (in realtà, il generico print.default) gestisce i caratteri di escape come fa cat (stampa così com'è, per ottenere una nuova riga quando si stampa \n).

Modifica In realtà, print.default Escapes caratteri non stampabili (cat pagina Guida in linea)

Le stringhe di caratteri sono uscita 'come è' (a differenza di print.default che sfugge i caratteri non stampabili e backslash [.. .])

Così si dovrebbe cominciare a preparare un proprio metodo (anche, verificare le opzioni sulla conversione R si oppone a $$ \ LaTeX $$ tabelle, forse v'è un'opzione).

+0

Ho commentato sopra per creare nomi di colonne più brevi. Intendevo ciò. Abbrevia i nomi delle colonne con un numero ragionevole di 6-8 caratteri e hanno una chiave sul lato che spiega di cosa si tratta. In questo modo puoi manipolare i tuoi dati molto più facilmente e, se necessario, puoi cambiare i nomi delle colonne quando sei pronto per pubblicare. – N8TRO

+1

E sono totalmente d'accordo :) Volevo solo fare l'umorismo a Innuo (e mostrare la potenziale difficoltà del compito, se ci si avventurasse in esso). –

+1

Ok. +1 per lo sforzo, ma Innuo non ha detto nulla su LaTeX nella domanda e riconfigurare le impostazioni predefinite di R è quasi sempre una cattiva idea. – N8TRO

1

RIMOZIONE riga della matrice E COLONNE

qualche modo modificato il codice di 42- sopra per affrontare il problema della rimozione della riga di matrice e indici colonna creando una modifica della funzione print. Ecco il codice:

pdfrm <- function(dfrm) { # first print the names broken into sections 
    mprint <- function(Mn){ 
    rownames(Mn) <- rep("",nrow(Mn)) 
    colnames(Mn) <- rep("",ncol(M)) 
    print(as.table(Mn),quote=FALSE,print.gap=8) 
    } 
    mprint(unname(
    t(sapply(1:(max(nchar(names(dfrm))) %/% 12), 
       # first construct break points to be passed to `substr` 
       function(rr) sapply(names(dfrm), substr, 1+(rr-1)*10, 9+(rr-1)*10))))) 
    # Now print a headerless data.frame with wider spacing 
    print(setNames(dfrm, rep(" ", length(dfrm))), print.gap = 15 ) 
} 
pdfrm(dfrm) 

e ouputs seguente:

 reallly_l  secondrea  short 
     ng.nameee  lly_long.    
     eeeeeeeee  ameeeeeee    

1    a    a    2 
2    b    b    2 
3    c    c    2 
4    d    d    2 
5    e    e    2 

Il codice sopra potrebbe essere modificata in modo che possa prendersi cura di spaziatura arbitraria e adattivo.

Problemi correlati