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))
Print row and column headingsOn the Layout tab, under Print, select the Headings check box. On the File menu, click Print.
From the View tab, Windows Group, click the Freeze Panes drop down arrow. Select either Freeze Top Row or Freeze First Column.
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.
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.
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.
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With