2015-09-03 15 views
7

Czy istnieje sposób drukowania małego data.frames na konsoli w bardziej czytelny sposób?Wydrukuj ładne data.frames/tabele na konsolę

Na przykład, byłoby możliwe do wyjścia do konsoli:

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 

jako

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 | 
    +--------------+-------------+--------------+-------------+---------+ 

Zdaję sobie sprawę z dużej data.frames zajęłoby się nadmierną ilość czasu, ale jeśli jest to opcja, chciałbym móc spojrzeć na małe ramki w bardziej uporządkowany sposób.

W szczególności, gdy mam dwa pola tekstowe obok siebie, byłoby o wiele łatwiej, gdyby między nimi znajdowała się faza, ponieważ odstępy między wyrazami są takie same jak odstępy między kolumnami.

Dzięki

+2

Co powiesz na "Widok (tęczówka [1: 5,])"? –

+0

Czy wypróbowałeś pakiet 'dplyr'? Posiada funkcję 'tbl_df' do konwersji na to, co Hadley Wickham nazywa lokalną strukturą data.frame. Ma on (i robi, IMO) zapewnić bardziej uporządkowane i czytelne dane wyjściowe podczas drukowania na konsoli. Nie zapewnia jednak separatorów między polami. – misspelled

+0

Tak, użyłem ich obu. Chciałbym wydrukować konsolę, ponieważ potrzebuję interaktywnie zmienić niektóre wartości między dwiema tabelami, co wiąże się z interpretacją tekstu dla ~ 250 wartości, więc próbuję po prostu ułatwić zarządzanie. Używam również "data.table" w większej części - wynik, który uważam za lepszy niż 'dplyr'. –

Odpowiedz

12

W przypadku pomaga nikomu, po prostu natknął się na fakt, że knitr „s kable osiąga piękny ładny wydruk. Połączyć z niektórymi z powyższych sugestii .Rprofile, wydaje się, że osiągnąłem to, co miałem na myśli.

> 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

Od wersji dziewiarskiej 1.16 tak już nie jest (to znaczy, że nie jest już ładnym drukiem). @yihui - jakieś pomysły? – Shantanu

+0

@Shantanu Działa dla mnie z knitr_1.17 – G5W

+0

@ G5W Dzięki za zgłoszenie. Zdałem sobie sprawę, że problem jest związany z fragmentami Rmd. W RStudio utwórz nowy plik Rmd, wykonaj porcję (dowolną porcję), a następnie uruchom 'knitr :: kable (head (iris))'. Dane wyjściowe nie wyglądają teraz tak czysto (np. Zawierają 'attr (," format ")' 'attr (," class ")' 'attr (," knit_cacheable ")' itd.) – Shantanu

3

Istnieje kilka metod, które możesz wypróbować.

  1. Dodaj kilka funkcji pomocniczych do swojego .Rprofile. W moim profilu mam

    Ta funkcja drukuje lewy górny róg ramki danych. Mam też

    ht = function(d, n=6) rbind(head(d, n), tail(d,n)) 
    
  2. Stwórz własną funkcję S3 druku dla ramek danych, na przykład

    print.data.frame = function(x, ..., digits = NULL, 
             quote = FALSE, right = TRUE, 
             row.names = TRUE) 
            message("hi") 
    
  3. Użyj pakietu, np. dplyr. Jest to jednak trochę przesada, jeśli chcesz tylko ładnego drukowania.

+0

Wszystko, czego chcę, to ładne drukowanie. Obiekty są tak czy inaczej "data.tables", więc są domyślnie drukowane jako wiersze '5 head',' 5 tail'. Dziękujemy za słowo kluczowe "pretty". Wygląda na bardziej odpowiedni tytuł. –

+1

Jeśli chcesz ładnie drukować, utwórz funkcję o nazwie 'print.data.table'. Po wydrukowaniu tabeli danych na ekranie funkcja ta zostanie wykonana. – csgillespie

1

miałem ten sam problem niedawno natknąłem pakietu huxtable. Jest bardzo elastyczny i może leciutki overkill dla ładniejszego wyjścia konsoli, ale bardzo dobrze mi to służyło.

Oto w jaki sposób można rozwiązać problemu przy użyciu 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) 

Myślę, że wszystkie funkcje mówią same za siebie. Dokładne wprowadzenie zawiera artykuł https://hughjonesd.github.io/huxtable/huxtable.html#adding-row-and-column-names.

print_screen(iris_hux) wydajność wyjście (w konsoli!):

enter image description here

I nie zorientowali się jeszcze, jak stłumić dolną informacje na temat nazw kolumn. Więc jeśli ktoś wie, proszę o komentarz!

Edycja: W celu stłumienia nazwy kolumna z dołu, należy colnames = FALSE wewnątrz print_screen().

0

Jeśli jesteś otwarty na drukowanie swoich wyników w panelu przeglądarki (RStudio), a nie na konsolecie, polecam korzystanie z pakietu DT.

library(DT) 
datatable(iris) 

Ma to kilka zalet, myślę: wyjście jest ładna i dobrze ułożone, pakiet jest w stanie wyświetlić dużych ramek danych, nie stając się kłopotliwe i jest wysoce konfigurowalny do rozruchu.

enter image description here