[R] For loop and sqldf

Gabor Grothendieck ggrothendieck at gmail.com
Fri May 6 13:52:46 CEST 2011


On Fri, Apr 29, 2011 at 4:27 PM, mathijsdevaan <mathijsdevaan at gmail.com> wrote:
> Hi list,
>
> Can anyone tell my why the following does not work? Thanks a lot! Your help
> is very much appreciated.
>
> DF = data.frame(read.table(textConnection("    B  C  D  E  F  G
> 8025  1995  0  4  1  2
> 8025  1997  1  1  3  4
> 8026  1995  0  7  0  0
> 8026  1996  1  2  3  0
> 8026  1997  1  2  3  1
> 8026  1998  6  0  0  4
> 8026  1999  3  7  0  3
> 8027  1997  1  2  3  9
> 8027  1998  1  2  3  1
> 8027  1999  6  0  0  2
> 8028  1999  3  7  0  0
> 8029  1995  0  2  3  3
> 8029  1998  1  2  3  2
> 8029  1999  6  0  0  1"),head=TRUE,stringsAsFactors=FALSE))
> list<-sort(unique(DF$C))
> for (t in 1:length(list))
>        {
>        year = as.character(list[t])
>        data[year]<-sqldf('select * from DF where C = [year]')
>        }
>
> I am trying to split up the data.frame into 5 new ones, one for every year.
>
>

This has already been answered but just thought I would point out that
the perhaps subtle point is that sqldf automatically loads data frames
that it finds in your sql statement into the data base but it does not
do anything with non-data frame variables.

Thus DF is a data frame in your workspace is loaded into the database
but year is not.

Also at least in sqlite you can't put a constant in square brackets.

To construct the desired sql string you can use paste, sprintf or
gsubfn's perl-like $ string interpolation which is invoked by
prefacing sqldf with fn$ and prefacing the variable to interpolate
with a $.   gsubfn is automatically loaded by sqldf.   See
http://gsubfn.googlecode.com for more on fn.

library(sqldf)

# test data
DF <- data.frame(a = 1:10, C = rep(1970:1971, each = 5))
year <- 1970

sqldf(paste("select * from DF where C =", year))

sqldf(sprintf("select * from DF where C=%s", year))

fn$sqldf("select * from DF where C = $year")

-- 
Statistics & Software Consulting
GKX Group, GKX Associates Inc.
tel: 1-877-GKX-GROUP
email: ggrothendieck at gmail.com



More information about the R-help mailing list