How to import some parts of a large database

In the introduction of Computational Actuarial Science with R, there was a short paragraph on how could we import only some parts of a large database, by selecting specific variables. The trick was to use the following

> read.table.select.columns=function(datatablename,
I,sep=";"){
+ datanc=read.table(datatablename,header=TRUE,
sep=sep,skip=0,nrows=1)
+ mycols=rep("NULL",ncol(datanc))
+ names(mycols)=names(datanc)
+ mycols[I]=NA
+ datat=read.table(datatablename,header=TRUE,
sep=sep,colClasses=mycols)
+ return(datat)}

For instance, if we use the same dataset as in the introduction, we can import only two variables of interest,

> loc="http://myweb.fsu.edu/jelsner/extspace/extremedatasince1899.csv"
> dt1=read.table.select.columns(loc,c("Region",
"Wmax"),sep=",")
> head(dt1,10)
    Region      Wmax
1    Basin 105.56342
2    Basin  40.00000
3    Basin  35.41822
4    Basin  51.06743
5  Florida  87.34328
6    Basin  96.64138
7     Gulf  35.41822
8       US  35.41822
9       US  87.34328
10      US 106.35318
> dim(dt1)
[1] 2100    2

In other cases, it might be interesting to select some raws, or to avoid some of them (e.g. because of some typos in the original dataset). If we want to drop some specific raws, we can use

> read.table.drop.rows=function(datatablename,
I,sep=";"){
+ I=sort(I)
+ if(min(I)>1) minI=1
+ if(min(I)==1) minI=NULL
+ index1=c(minI,I[c(which(diff(I)>1),length(I))]+1)
+ index2=c(I[c(minI,which(diff(I)>1)+1)],
max(index1)-1)
+ datat=read.table(datatablename,header=TRUE,
sep,skip=0,nrows=1)
+ datat=datat[-1,]
+ for(i in 1:length(index1)){
+ datat0=read.table(datatablename,header=FALSE,
sep=sep,skip=index1[i],nrows=index2[i]-index1[i])
+ names(datat0)=names(datat)
+ datat=rbind(datat,datat0)
+ }
+ return(datat)}

On the same dataset, assume that we have some troubles reading some lines, or we know that values are not valid,

> dt2=read.table.drop.rows(loc,c(3,6:8),sep=",")
> head(dt2[,1:5],10)
     Yr  Region      Wmax      sst sun
1  1899   Basin 105.56342 0.046596 8.4
2  1899   Basin  40.00000 0.046596 8.4
3  1899   Basin  51.06743 0.046596 8.4
4  1899 Florida  87.34328 0.046596 8.4
5  1899      US  87.34328 0.046596 8.4
6  1899      US 106.35318 0.046596 8.4
7  1899      US  51.06743 0.046596 8.4
8  1899      US  90.19791 0.046596 8.4
9  1899   Basin  56.48593 0.046596 8.4
10 1899   Basin 131.26902 0.046596 8.4
> dim(dt2)
[1] 2096   11

Now, we can try to do both at the same time (more or less) : for some specific variables, we want to import a subpart of the database, but we also want to avoid some specific lines,

> read.table.select.columns.rows=function(
datatablename,Ic,Ir,sep=";"){
+ datanc=read.table(datatablename,header=TRUE,
sep=sep,skip=0,nrows=1)
+ mycols=rep("NULL",ncol(datanc))
+ names(mycols)=names(datanc)
+ mycols[Ic]=NA
+ I=sort(Ir)
+ if(min(I)>1) minI=1
+ if(min(I)==1) minI=NULL
+ index1=c(minI,I[c(which(diff(I)>1),length(I))]+1)
+ index2=c(I[c(minI,which(diff(I)>1)+1)],
max(index1)-1)
+ datat=read.table(datatablename,header=TRUE,
sep=sep,skip=0,nrows=1,colClasses=mycols)
+ datat=datat[-1,]
+ for(i in 1:length(index1)){
+ datat0=read.table(datatablename,header=FALSE,
sep=sep,skip=index1[i],nrows=index2[i]-index1[i],colClasses=mycols)
+ names(datat0)=names(datat)
+ datat=rbind(datat,datat0)
+ }
+ return(datat)}
> dt3=read.table.select.columns.rows(loc,
c("Wmax","Region"),c(3,6:8),sep=",")
> head(dt3)
   Region      Wmax
1   Basin 105.56342
2   Basin  40.00000
3   Basin  51.06743
4 Florida  87.34328
5      US  87.34328
6      US 106.35318
> dim(dt3)
[1] 2096    2

One can observe that it is the same, here, as

> df=read.table(loc,header=TRUE,sep=",")
> sdf=df[-c(3,6:8),c("Wmax","Region")]
> head(sdf)
        Wmax  Region
1  105.56342   Basin
2   40.00000   Basin
4   51.06743   Basin
5   87.34328 Florida
9   87.34328      US
10 106.35318      US
> dim(sdf)
[1] 2096    2

But if the dataset was much larger (with thousands of variables) with also some problems on specific lines, we now have a nice code to import our database.


OpenEdition suggests that you cite this post as follows:
Arthur Charpentier (October 2, 2014). How to import some parts of a large database. Freakonometrics. Retrieved December 3, 2024 from https://doi.org/10.58079/oux2


Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.