Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make 'head' be applied automatically to output?

Tags:

r

I have a bunch of large dataframes, so every time I want to display them, I have to use head:

head( blahblah(somedata) )

Typing head all the time gets old after the first few hundred times, so I'd like an easy way to do this if possible. One of the cool things about R compared to java that things like this are often really easy, if you know the secret incantation.

I searched in options, and found max.print, which almost works, except there is now a time delay.

head( blahblah(somedata) )

.... is instantaneous (to within the limits of my perception)

options(max.print=100)
blahblah(somedata)

.... takes about 3 seconds, so longer than typing head

Is there some way of making head be applied automatically when printing large data structures?

An piece of code which reproduces this behavior:

long_dataset = data.frame(a = runif(10e5), 
                          b = runif(10e5), 
                          c = runif(10e5))
system.time(head(long_dataset))
options(max.print = 6)
system.time(print(long_dataset))
like image 839
Hugh Perkins Avatar asked Oct 23 '12 05:10

Hugh Perkins


People also ask

How do you keep the heading in Excel when printing?

Print row and column headingsOn the Layout tab, under Print, select the Headings check box. On the File menu, click Print.

How do I keep column headers when scrolling in Excel?

From the View tab, Windows Group, click the Freeze Panes drop down arrow. Select either Freeze Top Row or Freeze First Column.

How do I make the first row a header in Excel?

In the query pane, select Edit to open the Power Query editor. To confirm that Power Query recognized your headers in the top row, select Home > Transform, and then select Use first row as headers. Power Query converts the first row of data to a header row. To return to the original headers, you can delete that step.

Which keyboard shortcut will automatically return you to cell A1?

The easiest way to go back to the A1 cell may the shortcut keys, please do as this: Hold down the Ctrl + Home keys together as following screenshot shown, the cursor will be jump to the cell A1 from anywhere of the worksheet.


2 Answers

Putting my comment into an answer, using the data.table package (and data.table not data.frame objects) will automatically print only the first 5 and last 5 rows (once the data.table is larger than 100 rows)

library(data.table)
DT <- data.table(long_data)
DT

      1: 0.19613138 0.88714284 0.25715067
      2: 0.25405787 0.76544909 0.75632468
      3: 0.24841384 0.22095875 0.52588596
      4: 0.72766161 0.79696771 0.88802759
      5: 0.02448372 0.77885568 0.38199993
     ---                                 
 999996: 0.28230967 0.09410921 0.84420162
 999997: 0.73598931 0.86043537 0.30147089
 999998: 0.86314546 0.90334347 0.08545391
 999999: 0.85507851 0.46621131 0.23892566
1000000: 0.33172155 0.43060483 0.44173400

The data.table FAQ 2.11 deals with this explicitly.


EDIT to deal with existing data.frame objects you don't want to convert.

If you were hesitant at converting existing data.frame objects to data.table objects, you could simply define print.data.frame as data.table:::print.data.table

print.data.frame <- data.table:::print.data.table

long_dataset

      1: 0.19613138 0.88714284 0.25715067
      2: 0.25405787 0.76544909 0.75632468
      3: 0.24841384 0.22095875 0.52588596
      4: 0.72766161 0.79696771 0.88802759
      5: 0.02448372 0.77885568 0.38199993
     ---                                 
 999996: 0.28230967 0.09410921 0.84420162
 999997: 0.73598931 0.86043537 0.30147089
 999998: 0.86314546 0.90334347 0.08545391
 999999: 0.85507851 0.46621131 0.23892566
1000000: 0.33172155 0.43060483 0.44173400
like image 113
mnel Avatar answered Oct 16 '22 18:10

mnel


I'd go along with @thelatemail's suggestion, i.e. redefine print.data.frame:

print.data.frame <- function(df) {
   if (nrow(df) > 10) {
      base::print.data.frame(head(df, 5))
      cat("----\n")
      base::print.data.frame(tail(df, 5))
   } else {
      base::print.data.frame(df)
   }
}

data.frame(x=1:100, y=1:100)
#   x y
# 1 1 1
# 2 2 2
# 3 3 3
# 4 4 4
# 5 5 5
# ----
#       x   y
# 96   96  96
# 97   97  97
# 98   98  98
# 99   99  99
# 100 100 100

A more elaborate version could line everything up together and avoid the repeated header, but you get the idea.

You could put such function in your .Rprofile or Rprofile.site files (see ?Startup) so it will be there every time you start an R session.

like image 24
flodel Avatar answered Oct 16 '22 19:10

flodel