Chapter 7. Joining data sources
50
country,GDP
UK,100
US,500
IT,150
FR,180
The variable country, which is also found in hholds.csv, is string-valued. We can pull the GDP of
the country in which the household resides into our households dataset with
open hholds.csv -q
join countries.csv GDP --ikey=country
which gives
hid
country
GDP
1
1
1
500
2
6
2
150
3
3
3
100
4
4
2
150
5
2
1
500
6
5
2
150
7.7 Importing multiple series
The examples given so far have been limitedin one respect. While several columns in the outer data
file may be referenced(askeys,or in filteringor aggregation) only one column hasactually provided
data—and correspondingly only one series in the inner dataset has been createdor modified—per
invocation of join. However, join can handle the importation of several series at once. This
section gives an account of the required syntax along with certain restrictions that apply to the
multiple-import case.
There are two ways to specify more than one series for importation:
1. The varname field in thecommand can take the form of a space-separatedlist of names rather
than a single name.
2. Alternatively, you can give the name of an array of strings in place of varname: the elements
of this array should be the names of the series to import.
Here are the limitations:
1. The --data option, which permits the renaming of a series on import, is not available. When
importingmultiple seriesyou are obliged to accept their “outer” names, fixed upas described
in section7.2.
2. While the other join options are available, they necessarily apply uniformly to all the series
importedvia a given command. Thismeans that ifyou want to import several series but using
different keys, filters or aggregation methods you must use a sequence of commands.
Here are a couple of examples of multiple imports.
# open base datafile containing keys
open PUMSdata.gdt
# join using a list of import names
join ss13pnc.csv SCHL WAGP WKHP --ikey=SERIALNO,SPORDER
Change pdf to powerpoint online - Library SDK class:C# Create PDF from PowerPoint Library to convert pptx, ppt to PDF in C#.net, ASP.NET MVC, WinForms, WPF
Online C# Tutorial for Creating PDF from Microsoft PowerPoint Presentation
www.rasteredge.com
Change pdf to powerpoint online - Library SDK class:VB.NET Create PDF from PowerPoint Library to convert pptx, ppt to PDF in vb.net, ASP.NET MVC, WinForms, WPF
VB.NET Tutorial for Export PDF file from Microsoft Office PowerPoint
www.rasteredge.com
Chapter 7. Joining data sources
51
# using a strings array: may be worthwhile if the array
# will be used for more than one purpose
strings S = array(3)
S[1] = "SCHL"
S[2] = "WAGP"
S[3] = "WKHP"
join ss13pnc.csv S --ikey=SERIALNO,SPORDER
7.8 A real-world case
For a real use-case forjoin with cross-sectional data,we turn to the Bank ofItaly’sSurveyon House-
hold Income and Wealth (SHIW).
1
In ASCII form the 2010 survey results comprise 47MB of data in
29 files. In this exercise we will draw on five of the SHIW files to construct a replica of the dataset
used in Thomas Mroz’s famous paper (Mroz,1987) on women’s labor force participation, which
contains data on married women between the age of 30 and 60 along with certain characteristics
of their households and husbands.
Our general strategy is as follows: we create a “core” dataset by opening the file carcom10.csv,
which contains basic data on the individuals. After dropping unwanted individuals (all but married
women), we use the resulting dataset as a base for pulling in further data via the join command.
The complete script to do the job is given in the Appendix to this chapter; here we walk through
the script with comments interspersed. We assume that all the relevant files from the Bank of Italy
survey are contained in a subdirectory called SHIW.
Starting with carcom10.csv, we use the --cols option to the open command to import specific
series, namely NQUEST (household ID number), NORD (sequence number for individuals within each
household), SEX (male = 1, female = 2), PARENT (status in household: 1 = head of household, 2 =
spouse of head, etc.), STACIV (marital status: married = 1), STUDIO (educational level, coded from
1to 8), ETA (age in years) and ACOM4C (size of town).
open SHIW/carcom10.csv --cols=1,2,3,4,9,10,29,41
We then restrict the sample to marriedwomen from 30 to 60 years of age, andadditionally restrict
the sample of women to those who are either heads of households or spouses of the head.
smpl SEX==2 && ETA>=30 && ETA<=60 && STACIV==1 --restrict
smpl PARENT<3
--restrict
For compatibility with the Mroz dataset as presented in the gretl data file mroz87.gdt, we rename
the age and education variables as WA and WE respectively, we compute the CIT dummy and finally
we store the reduced base dataset in gretl format.
rename ETA WA
rename STUDIO WE
series CIT = (ACOM4C > 2)
store mroz_rep.gdt
The next step will be to get data on working hours from the jobs file allb1.csv. There’s a com-
plication here. We need the total hours worked over the course of the year (for both the women
and their husbands). This is not available as such, but the variables ORETOT and MESILAV give,
respectively, average hours worked per week andthe number of months worked in 2010, each on a
1
Detailsof the survey canbe found athttp://www.bancaditalia.it/statistiche/indcamp/bilfait/dismicro.
The ASCII(CSV) data filesfor the 2010survey are available athttp://www.bancaditalia.it/statistiche/indcamp/
bilfait/dismicro/annuale/ascii/ind10_ascii.zip.
Library SDK class:Online Convert PowerPoint to PDF file. Best free online export
Online Powerpoint to PDF Converter. Download Free Trial. Convert a PPTX/PPT File to PDF. Just upload your file by clicking on the blue
www.rasteredge.com
Library SDK class:RasterEdge for .NET Online Demo
Convert Word to PDF; Convert Excel to PDF; Convert PowerPoint to PDF; PDF Files; Split PDF Document; Remove Password from PDF; Change PDF Permission Settings.
www.rasteredge.com
Chapter 7. Joining data sources
52
per-job basis. If each person held at most one job over the yearwe couldcompute his or her annual
hours as
HRS = ORETOT * 52 * MESILAV/12
However, some people had more than one job, and in this case what we want is the sum of annual
hours across their jobs. We could use join with the seq aggregation method to construct this sum,
but it is probably more straightforward to read the allb1 data, compute the HRS values per job as
shown above, and save the results to a temporary CSV file.
open SHIW/allb1.csv --cols=1,2,8,11 --quiet
series HRS = misszero(ORETOT) * 52 * misszero(MESILAV)/12
store HRS.csv NQUEST NORD HRS
Now we can reopen the base dataset and join the hours variable from HRS.csv. Note that we need
adouble key here: the women are uniquely identified by the combination of NQUEST and NORD. We
don’t need an okey specification since these keys go under the same names in the right-hand file.
We define labor force participation, LFP, based on hours.
open mroz_rep.gdt
join HRS.csv WHRS --ikey=NQUEST,NORD --data=HRS --aggr=sum
WHRS = misszero(WHRS)
LFP = WHRS > 0
For reference, here’s how we could have used seq to avoid writing a temporary file:
join SHIW/allb1.csv njobs --ikey=NQUEST,NORD --data=ORETOT --aggr=count
series WHRS = 0
loop i=1..max(njobs) -q
join SHIW/allb1.csv htmp --ikey=NQUEST,NORD --data=ORETOT --aggr="seq:$i"
join SHIW/allb1.csv mtmp --ikey=NQUEST,NORD --data=MESILAV --aggr="seq:$i"
WHRS += misszero(htmp) * 52 * misszero(mtmp)/12
endloop
To generate the work experience variable, AX, we use the file lavoro.csv: this contains a variable
named ETALAV which records the age at which the person first started work.
join SHIW/lavoro.csv ETALAV --ikey=NQUEST,NORD
series AX = misszero(WA - ETALAV)
We compute the woman’s hourly wage, WW, as the ratio of total employment income to annual
working hours. This requires drawing the series YL (payroll income) and YM (net self-employment
income) from the persons file rper10.csv.
join SHIW/rper10.csv YL YM --ikey=NQUEST,NORD --aggr=sum
series WW = LFP ? (YL + YM)/WHRS : 0
The family’s net disposable income is available as Y in the file rfam10.csv; we import this as
FAMINC.
join SHIW/rfam10.csv FAMINC --ikey=NQUEST --data=Y
Data on number of children are now obtained by applying the count method. For the Mroz repli-
cation we want the number of children under the age of 6, and also the number aged 6 to 18.
join SHIW/carcom10.csv KIDS --ikey=NQUEST --aggr=count --filter="ETA<=18"
join SHIW/carcom10.csv KL6 --ikey=NQUEST --aggr=count --filter=ETA<6
series K618 = KIDS - KL6
Library SDK class:C# HTML5 PDF Viewer SDK to view PDF document online in C#.NET
Convert Word to PDF; Convert Excel to PDF; Convert PowerPoint to PDF; PDF Files; Split PDF Document; Remove Password from PDF; Change PDF Permission Settings.
www.rasteredge.com
Library SDK class:VB.NET PDF- View PDF Online with VB.NET HTML5 PDF Viewer
Convert Word to PDF; Convert Excel to PDF; Convert PowerPoint to PDF; PDF Files; Split PDF Document; Remove Password from PDF; Change PDF Permission Settings.
www.rasteredge.com
Chapter 7. Joining data sources
53
We want to add data on the women’s husbands, but how do we find them? To do this we create an
additional inner key which we’ll call H_ID (husband ID), by sub-samplingin turn on the observations
falling into each of two classes: (a) those where the woman is recorded as head of household and
(b) those where the husband has that status. In each case we want the individual ID (NORD) of the
household member whose status is complementary to that of the woman in question. So for case
(a) we subsample using PARENT==1(headofhousehold) andfilter the join using PARENT==2 (spouse
of head); in case (b) we do the converse. We thus construct H_ID piece-wise.
# for women who are household heads
smpl PARENT==1 --restrict --replace
join SHIW/carcom10.csv H_ID --ikey=NQUEST --data=NORD --filter="PARENT==2"
# for women who are not household heads
smpl PARENT==2 --restrict --replace
join SHIW/carcom10.csv H_ID --ikey=NQUEST --data=NORD --filter="PARENT==1"
smpl full
Now we can use our new inner key to retrieve the husbands’ data, matching H_ID on the left with
NORD on the right within each household.
join SHIW/carcom10.csv HA --ikey=NQUEST,H_ID --okey=NQUEST,NORD --data=ETA
join SHIW/carcom10.csv HE --ikey=NQUEST,H_ID --okey=NQUEST,NORD --data=STUDIO
join HRS.csv HHRS --ikey=NQUEST,H_ID --okey=NQUEST,NORD --data=HRS --aggr=sum
HHRS = misszero(HHRS)
The remainder of the script is straightforward and does not require discussion here: we recode
the education variables for compatibility; delete some intermediate series that are not needed any
more; addinformative labels; and save the final product. See the Appendixfor details.
To compare the results from this dataset with those from the earlier US data used by Mroz,one can
copy the input file heckit.inp (supplied with the gretl package) and substitute mroz_rep.gdt for
mroz87.gdt. It turns out that the results are qualitatively very similar.
7.9 The representation of dates
Upto thispoint all the data we have consideredhave been cross-sectional. In the followingsections
we discuss data that have a time dimension, and before proceeding it may be useful to say some-
thing about the representation of dates. Gretl takes the ISO 8601 standard as its reference point
but provides mean of converting dates provided in other formats; it also offers a set of calendrical
functions for manipulating dates (isodate, isoconv, epochday and others).
ISO 8601 recognizes two formats for daily dates, “extended” and “basic”. In both formats dates
are given as 4-digit year, 2-digit month and 2-digit day, in that order. In extended format a dash
is inserted between the fields—as in 2013-10-21 or more generally YYYY-MM-DD—while in basic
format the fields are run together (YYYYMMDD). Extended format is more easily parsed by human
readers while basic format is more suitable for computer processing, since one can apply ordinary
arithmetic to compare dates as equal, earlier or later. The standard also recognizes YYYY-MM as
representingyearandmonth,e.g. 2010-11 for November2010,2 aswell as a plain four-digit number
for year alone.
One problem for economists is that the “quarter” is not a period covered by ISO 8601. This could
be presentedby YYYY-Q (with only one digit following the dash) but in gretl output we in fact use a
colon, as in 2013:2 for the second quarter of 2013. (For printed output of months gretl also uses
acolon, as in 2013:06. A difficulty with following ISO here is that in a statistical context a string
such as 1980-10 may look more like a subtraction than a date.) Anyway, at present we are more
interested in the parsingofdateson input ratherthan in what gretl prints. Andin that context note
that “excess precision” is acceptable: a month may be represented by its first day (e.g. 2005-05-01
2
Theform YYYYMM isnot recognizedforyear and month.
Library SDK class:RasterEdge XDoc.PowerPoint for .NET - SDK for PowerPoint Document
Add image to specified position on PowerPoint page. Next Steps. Download Free Trial Download and try PDF for .NET with online support. See Pricing
www.rasteredge.com
Library SDK class:DocImage SDK for .NET: Web Document Image Viewer Online Demo
Try Online Demo Now. Please click Browse to upload a file to display in web viewer. Suppported files are Word, Excel, PowerPoint, PDF, Tiff, Dicom and main
www.rasteredge.com
Chapter 7. Joining data sources
54
for May, 2005), and a quarter may be represented by its first month and day (2005-07-01 for the
third quarter of 2005).
Some additional points regarding dates will be taken up as they become relevant in practical cases
of joining data.
7.10 Time-series data
Suppose our left-hand dataset is recognized by gretl as time series with a supported frequency
(annual, quarterly, monthly, weekly, daily or hourly). This will be the case if the original data were
read from a file that contained suitable time or date information, or if a time-series interpretation
has been imposed using either the setobs command or its GUI equivalent. Then—apart, perhaps,
from some very special cases—joining additional data is bound to involve matching observations
by time-period.
In this case, contrary to the cross-sectional case, the inner dataset has a natural ordering which
gretl is aware of; hence, no “inner key” is required. All we need is a means of identifying the period
on the right and this is why, in a time-series context, we’ll refer to the outer key as the “time key”.
Most likely, this information will appear in a single column in the outer data file, often but not
always the first column.
The join command provides a simple (but limited) default for extracting period information from
the outer data file, plus an option that can be used if the default is not applicable, as follows.
 The default assumptions are: (1) the time key appears in the first column; (2) the heading
of this column is either left blank or is one of obs, date, year, period, observation, or
observation_date (on a case-insensitive comparison); and (3) the time format conforms
to ISO 8601 where applicable (“extended” daily date format YYYY-MM-DD, monthly format
YYYY-MM, or annual format YYYY).
 If dates do not appear in the first column of the outer file, or ifthe column heading or format
is not as just described, the --tkey option can be used to indicate which column should be
used and/or what format shouldbe assumed.
Setting the time-key column and/or format
The --tkey option requires a parameter holding the name of the column in which the time key
is located and/or a string specifying the format in which dates/times are written in the time-key
column. This parameter should be enclosed in double-quotes. If both elements are present they
should be separated by a comma; ifonly a format is given it shouldbe precededby a comma. Some
examples:
--tkey="Period,%m/%d/%Y"
--tkey="Period"
--tkey="obsperiod"
--tkey=",%Ym%m"
The first of these applies if Period is not the first column on the right, and dates are given in the
US format of month, day, year, separated by slashes. The second implies that although Period is
not the first column, the date format is ISO 8601. The third again implies that the date format is
OK; here the name is required even if obsperiod is the first column since this heading is not one
recognized by gretl’s heuristic. The last example implies that dates are in the first column (with
one of the recognized headings), but are given in the non-standard format year, “m”, month.
The date format string should be composed using the codes employed by the POSIX function
strptime; Table7.2 contains a list of the most relevant codes.
3
3
The %q codefor quarter is notpresentin strptime; it is added for use with joinsince quarterly data are common
inmacroeconomics.
Library SDK class:VB.NET PDF - Create PDF Online with VB.NET HTML5 PDF Viewer
Convert Word to PDF; Convert Excel to PDF; Convert PowerPoint to PDF; PDF Files; Split PDF Document; Remove Password from PDF; Change PDF Permission Settings.
www.rasteredge.com
Library SDK class:VB.NET PDF - Annotate PDF Online with VB.NET HTML5 PDF Viewer
VB.NET HTML5 PDF Viewer: Annotate PDF Online. Click to strikethrough text on PDF page. Users can change outline color and set transparency value in properties.
www.rasteredge.com
Chapter 7. Joining data sources
55
Code
Meaning
%%
The % character.
%b
The month name according to the current locale, either abbreviated
or in full.
%C
The century number (0–99).
%d
The day ofmonth (1–31).
%D
Equivalent to %m/%d/%y. (This is the American style date, very con-
fusing to non-Americans, especially since %d/%m/%y is widely used in
Europe. The ISO 8601 standard format is %Y-%m-%d.)
%H
The hour (0–23).
%j
The day number in the year (1–366).
%m
The month number (1–12).
%n
Arbitrary whitespace.
%q
The quarter (1–4).
%w
The weekday number (0–6) with Sunday = 0.
%y
The year within century (0–99). When a century is not otherwise spec-
ified, values in the range 69–99 refer to yearsin the twentieth century
(1969–1999); values in the range 00–68 refer to years in the twenty-
first century (2000–2068).
%Y
The year, including century (for example, 1991).
Table 7.2: Date format codes
Example: daily stock prices
We show below the first few lines of a file named IBM.csv containing stock-price data for IBM
corporation.
Date,Open,High,Low,Close,Volume,Adj Close
2013-08-02,195.50,195.50,193.22,195.16,3861000,195.16
2013-08-01,196.65,197.17,195.41,195.81,2856900,195.81
2013-07-31,194.49,196.91,194.49,195.04,3810000,195.04
Note that the data are in reverse time-series order—that won’t matter to join, the data can appear
in any order. Also note that the first column is headed Date and holds daily dates as ISO 8601
extended. That means we can pull the data into gretl very easily. In the following fragment we
create a suitably dimensioned empty daily dataset then rely on the default behavior of join with
time-series data to import the closing stock price.
nulldata 500
setobs 5 2012-01-01
join IBM.csv Close
To make explicit what we’re doing, we couldaccomplish exactly the same using the --tkey option:
join IBM.csv Close --tkey="Date,%Y-%m-%d"
Example: OECD quarterly data
Table7.3 shows an excerpt from a CSV file provided by the OECD statistical site (stat.oecd.org)
in response to a request for GDP at constant prices for several countries.
4
4
Retrieved 2013-08-05. The OECD filesinfact contain two leading columnswithvery long labels; theseareirrelevant
tothepresentexampleand canbeomitted without altering thesamplescript.
Chapter 7. Joining data sources
56
Frequency,Period,Country,Value,Flags
"Quarterly","Q1-1960","France",463876.148126845,E
"Quarterly","Q1-1960","Germany",768802.119278467,E
"Quarterly","Q1-1960","Italy",414629.791450547,E
"Quarterly","Q1-1960","United Kingdom",578437.090291889,E
"Quarterly","Q2-1960","France",465618.977328614,E
"Quarterly","Q2-1960","Germany",782484.138122549,E
"Quarterly","Q2-1960","Italy",420714.910290157,E
"Quarterly","Q2-1960","United Kingdom",572853.474696578,E
"Quarterly","Q3-1960","France",469104.41925852,E
"Quarterly","Q3-1960","Germany",809532.161494483,E
"Quarterly","Q3-1960","Italy",426893.675840156,E
"Quarterly","Q3-1960","United Kingdom",581252.066618986,E
"Quarterly","Q4-1960","France",474664.327992619,E
"Quarterly","Q4-1960","Germany",817806.132384948,E
"Quarterly","Q4-1960","Italy",427221.338414114,E
...
Table 7.3: Example of CSVfile as provided by the OECD statistical website
This is an instance of data in what we call atomic format, that is, a format in which each line of the
outer file contains a single data-point and extracting data mainly requires filtering the appropriate
lines. The outer time key is under the Period heading, and has the format Q<quarter>-<year>.
Assuming that the file in Table7.3 has the name oecd.csv, the following script reconstructs the
time series of Gross Domestic Product for several countries:
nulldata 220
setobs 4 1960:1
join oecd.csv FRA --tkey="Period,Q%q-%Y" --data=Value --filter="Country==\"France\""
join oecd.csv GER --tkey="Period,Q%q-%Y" --data=Value --filter="Country==\"Germany\""
join oecd.csv ITA --tkey="Period,Q%q-%Y" --data=Value --filter="Country==\"Italy\""
join oecd.csv
UK --tkey="Period,Q%q-%Y" --data=Value --filter="Country==\"United Kingdom\""
Note the use of the format codes %q for the quarter and %Y for the 4-digit year. A touch of elegance
couldhave been added by storing the invariant options to join using the setopt command, as in
setopt join persist --tkey="Period,Q%q-%Y" --data=Value
join oecd.csv FRA --filter="Country==\"France\""
join oecd.csv GER --filter="Country==\"Germany\""
join oecd.csv ITA --filter="Country==\"Italy\""
join oecd.csv
UK --filter="Country==\"United Kingdom\""
setopt join clear
If one were importing a large number of such series it might be worth rewriting the sequence of
joins as a loop, as in
sprintf countries "France Germany Italy \"United Kingdom\""
sprintf vnames "FRA GER ITA UK"
setopt join persist --tkey="Period,Q%q-%Y" --data=Value
loop foreach i @countries
string vname = strsplit(vnames, i)
join oecd.csv @vname --filter="Country==\"$i\""
endloop
setopt join clear
Chapter 7. Joining data sources
57
7.11 Special handling of time columns
When dealing with straight time series data the tkey mechanism described above should suffice
in almost all cases. In some contexts, however, time enters the picture in a more complex way;
examplesincludepanel data (seesection7.12) andso-calledrealtimedata (see chapter8). To handle
such cases join provides the --tconvert option. This can be used to select certain columns in
the right-hand data file for special treatment: strings representing dates in these columns will be
converted to numerical values: 8-digit numbers on the pattern YYYYMMDD (ISO basic daily format).
Once dates are in this form it is easy to use them in key-matching or filtering.
By default it is assumed that the strings in the selected columns are in ISO extended format,
YYYY-MM-DD. If that is not the case you can supply a time-format string using the --tconv-fmt
option. The format string should be written using the codes shown in Table7.2.
Here are some examples:
# select one column for treatment
--tconvert=start_date
# select two columns for treatment
--tconvert="start_date,end_date"
# specify US-style daily date format
--tconv-fmt="%m/%d/%Y"
# specify quarterly date-strings (as in 2004q1)
--tconv-fmt="%Yq%q"
Some points to note:
 If a specified column is not selected for a substantive role in the join operation (as data to be
imported, as a key, or as an auxiliary variable for use in aggregation) the column in question
is not read and so no conversion is carried out.
 If a specified column contains numerical rather than string values, no conversion is carried
out.
 If a string value in a selected column fails parsing using the relevant time format (user-
specified or default), the converted value is NA.
 On successful conversion, the output is always in daily-date form as stated above. If you
specify a monthly or quarterly time format, the converted date is the first day of the month
or quarter.
7.12 Panel data
In section7.10 we gave an example of reading quarterly GDP data for several countries from an
OECD file. In that context we imported each country’s data as a distinct time-series variable. Now
suppose we want the GDP data in panel format instead (stacked time series). How can we do this
with join?
As a reminder, here’s what the OECD data look like:
Frequency,Period,Country,Value,Flags
"Quarterly","Q1-1960","France",463876.148126845,E
"Quarterly","Q1-1960","Germany",768802.119278467,E
"Quarterly","Q1-1960","Italy",414629.791450547,E
"Quarterly","Q1-1960","United Kingdom",578437.090291889,E
"Quarterly","Q2-1960","France",465618.977328614,E
Chapter 7. Joining data sources
58
and so on. If we have four countries and quarterly observations running from 1960:1 to 2013:2 (T
=214 quarters) we might set up our panel workspace like this:
scalar N = 4
scalar T = 214
scalar NT = N*T
nulldata NT --preserve
setobs T 1.1 --stacked-time-series
The relevant outer keys are obvious: Country for the country and Period for the time period. Our
task isnowto construct matching keys in the inner dataset. This can be done via two panel-specific
options to the setobs command. Let’s work on the time dimension first:
setobs 4 1960:1 --panel-time
series quarter = $obsdate
This variant of setobs allows us to tell gretl that time in our panel is quarterly, starting in the
first quarter of 1960. Having set that, the accessor $obsdate will give us a series of 8-digit dates
representing the first day of each quarter—19600101, 19600401, 19600701, and so on, repeating
for each country. As we explained in section7.11, we can use the --tconvert option on the outer
series Period to get exactly matching values (in this case using a format of Q%q-%Y for parsing the
Period values).
Now for the country names:
string cstrs
sprintf cstrs "France Germany Italy \"United Kingdom\""
setobs country cstrs --panel-groups
Here we write into the string cstrs the names of the countries, using escaped double-quotes to
handle the space in “United Kingdom”, then pass this string to setobs with the --panel-groups
option, preceded by the identifier country. This asks gretl to construct a string-valued series
named country, in which each name will repeat T times.
We’re now ready to join. Assuming the OECD file is named oecd.csv we do
join oecd.csv GDP --data=Value \
--ikey=country,quarter --okey=Country,Period \
--tconvert=Period --tconv-fmt="Q%q-%Y"
Other input formats
The OECD file discussed above is in the most convenient format for join, with one data-point per
line. But sometimes we may want to make a panel from a data file structuredlike this:
# Real GDP
Period,France,Germany,Italy,"United Kingdom"
"Q1-1960",463863,768757,414630,578437
"Q2-1960",465605,782438,420715,572853
"Q3-1960",469091,809484,426894,581252
"Q4-1960",474651,817758,427221,584779
"Q1-1961",482285,826031,442528,594684
...
Call this file side_by_side.csv. Assuming the same initial set-up as above, we can panelize the
data by setting the sample to each country’stime seriesin turn andimporting the relevant column.
The only point to watch here is that the string “United Kingdom”, being a column heading, will
become United_Kingdom on importing (see section7.2) so we’ll need a slightly different set of
country strings.
Chapter 7. Joining data sources
59
sprintf cstrs "France Germany Italy United_Kingdom"
setobs country cstrs --panel-groups
loop foreach i @cstrs --quiet
smpl country=="$i" --restrict --replace
join side_by_side.csv GDP --data=$i \
--ikey=quarter --okey=Period \
--tconvert=Period --tconv-fmt="Q%q-%Y"
endloop
smpl full
If our working dataset and the outer data file are dimensioned such that there are just as many
time-series observations on the right as there are time slots on the left—and the observations
on the right are contiguous, in chronological order, and start on the same date as the working
dataset—wecould dispense with the key apparatus and just use the first line ofthe join command
shown above. However, in general it is safer to use keys to ensure that the data end up in correct
registration.
7.13 Memo: join options
Basic syntax: join filename varname(s) [ options ]
flag
effect
--data
Give the name of the data column on the right, in case it differs from
varname (7.2); single import only
--filter
Specify a condition for filtering data rows (7.3)
--ikey
Specify up to two keys for matching data rows (7.4)
--okey
Specify outer key name(s) in case they differ the inner ones (7.4)
--aggr
Select an aggregation method for 1 to n joins (7.5)
--tkey
Specify right-hand time key (7.10)
--tconvert
Select outer date columns for conversion to numeric form (7.11)
--tconv-fmt
Specify a format for use with tconvert (7.11)
--no-header
Treat the first row on the right as data (7.2)
--verbose
Report on progress in reading the outer data
Documents you may be interested
Documents you may be interested