<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=R_-_Merging_Data_Frames</id>
	<title>R - Merging Data Frames - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=R_-_Merging_Data_Frames"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=R_-_Merging_Data_Frames&amp;action=history"/>
	<updated>2026-05-14T01:19:57Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://training-course-material.com/index.php?title=R_-_Merging_Data_Frames&amp;diff=52349&amp;oldid=prev</id>
		<title>Bernard Szlachta: /* Self-join */</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=R_-_Merging_Data_Frames&amp;diff=52349&amp;oldid=prev"/>
		<updated>2017-02-14T07:11:35Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Self-join&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Intro to R|040]]&lt;br /&gt;
&lt;br /&gt;
We want to select the name of an employee (ENAME column in &amp;#039;&amp;#039;emp&amp;#039;&amp;#039; data frame) and the department name (DNAME column in &amp;#039;&amp;#039;dept&amp;#039;&amp;#039; data frame) in which the employee works.&lt;br /&gt;
&lt;br /&gt;
First, merge two tables&lt;br /&gt;
&amp;lt;source lang=&amp;quot;rsplus&amp;quot;&amp;gt;&lt;br /&gt;
 merge(emp,dept,by=&amp;quot;DEPTNO&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
    DEPTNO   ID    ENAME       JOB  MGR   HIREDATE  SAL COMM      DNAME      LOC&lt;br /&gt;
 1      10 7839     BUSH PRESIDENT   NA 17/11/1981 5000   NA ACCOUNTING NEW YORK&lt;br /&gt;
 2      10 7934   ELISON     CLERK 7782 23/01/1982 1300   NA ACCOUNTING NEW YORK&lt;br /&gt;
 3      10 7782   MERKEL   MANAGER 7839 09/06/1981 2450   NA ACCOUNTING NEW YORK&lt;br /&gt;
 4      20 7566    PUTIN   MANAGER 7839 02/04/1981 2975   NA   RESEARCH   LONDON&lt;br /&gt;
 5      20 7369 THATCHER     CLERK 7902 17/12/1980  800   NA   RESEARCH   LONDON&lt;br /&gt;
 6      20 7788 CARNEGIE   ANALYST 7566 09/12/1982 3000   NA   RESEARCH   LONDON&lt;br /&gt;
 7      20 7876     FORD     CLERK 7788 12/01/1983 1100   NA   RESEARCH   LONDON&lt;br /&gt;
 8      20 7902    TOOSK   ANALYST 7566 03/12/1981 3000   NA   RESEARCH   LONDON&lt;br /&gt;
 9      30 7900  BUFFETT     CLERK 7698 03/12/1981  950   NA      SALES    PARIS&lt;br /&gt;
 10     30 7654  CHIRACK  SALESMAN 7698 28/09/1981 1250 1400      SALES    PARIS&lt;br /&gt;
 11     30 7698    BLAIR   MANAGER 7839 01/05/1981 2850   NA      SALES    PARIS&lt;br /&gt;
 12     30 7844    GATES  SALESMAN 7698 08/09/1981 1500    0      SALES    PARIS&lt;br /&gt;
 13     30 7521   WALTON  SALESMAN 7698 22/02/1981 1250  500      SALES    PARIS&lt;br /&gt;
 14     30 7499  BAROSSO  SALESMAN 7698 20/02/1981 1600  300      SALES    PARIS&lt;br /&gt;
 &lt;br /&gt;
Second, select ENAME and DNAME columns&lt;br /&gt;
&amp;lt;source lang=&amp;quot;rsplus&amp;quot;&amp;gt;&lt;br /&gt;
 merge(emp,dept,by=&amp;quot;DEPTNO&amp;quot;)[,c(&amp;quot;ENAME&amp;quot;,&amp;quot;DNAME&amp;quot;)]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
       ENAME      DNAME&lt;br /&gt;
 1      BUSH ACCOUNTING&lt;br /&gt;
 2    ELISON ACCOUNTING&lt;br /&gt;
 3    MERKEL ACCOUNTING&lt;br /&gt;
 4     PUTIN   RESEARCH&lt;br /&gt;
 5  THATCHER   RESEARCH &lt;br /&gt;
 6  CARNEGIE   RESEARCH &lt;br /&gt;
 7      FORD   RESEARCH&lt;br /&gt;
 8     TOOSK   RESEARCH&lt;br /&gt;
 9   BUFFETT      SALES&lt;br /&gt;
 10  CHIRACK      SALES&lt;br /&gt;
 11    BLAIR      SALES&lt;br /&gt;
 12    GATES      SALES&lt;br /&gt;
 13   WALTON      SALES&lt;br /&gt;
 14  BAROSSO      SALES&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can show all rows, even if there are no corresponding rows in another data frame.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;rsplus&amp;quot;&amp;gt;&lt;br /&gt;
 merge(emp,dept,by=&amp;quot;DEPTNO&amp;quot;,all=T)[,c(&amp;quot;ENAME&amp;quot;,&amp;quot;DNAME&amp;quot;)]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
      ENAME      DNAME&lt;br /&gt;
 1      BUSH ACCOUNTING&lt;br /&gt;
 2    ELISON ACCOUNTING&lt;br /&gt;
 3    MERKEL ACCOUNTING&lt;br /&gt;
 4     PUTIN   RESEARCH&lt;br /&gt;
 5  THATCHER   RESEARCH&lt;br /&gt;
 6  CARNEGIE   RESEARCH&lt;br /&gt;
 7      FORD   RESEARCH&lt;br /&gt;
 8     TOOSK   RESEARCH&lt;br /&gt;
 9   BUFFETT      SALES&lt;br /&gt;
 10  CHIRACK      SALES&lt;br /&gt;
 11    BLAIR      SALES&lt;br /&gt;
 12    GATES      SALES&lt;br /&gt;
 13   WALTON      SALES&lt;br /&gt;
 14  BAROSSO      SALES&lt;br /&gt;
 15     &amp;lt;NA&amp;gt; OPERATIONS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Non-equi join ===&lt;br /&gt;
If merge cannot find a common column or if the &amp;#039;&amp;#039;by&amp;#039;&amp;#039; parameter is not specified, &amp;#039;&amp;#039;merge&amp;#039;&amp;#039; function will return Cartesian Product of two data frames. &lt;br /&gt;
&lt;br /&gt;
This allows us to filter out rows using any condition we want.&lt;br /&gt;
&lt;br /&gt;
If we want to find the name of an employee and their salary grade, we have to get data from two data frames: EMP and SALGRADE.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;rsplus&amp;quot;&amp;gt;&lt;br /&gt;
  empsalgrade &amp;lt;- merge(emp,salgrade)&lt;br /&gt;
  with(empsalgrade,empsalgrade[SAL &amp;gt;= LOSAL &amp;amp; SAL &amp;lt;= HISAL,])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
      ID    ENAME       JOB  MGR   HIREDATE  SAL COMM DEPTNO GRADE LOSAL HISAL&lt;br /&gt;
 8  7900  BUFFETT     CLERK 7698 03/12/1981  950   NA     30     1   700  1200&lt;br /&gt;
 11 7369 THATCHER     CLERK 7902 17/12/1980  800   NA     20     1   700  1200&lt;br /&gt;
 13 7876     FORD     CLERK 7788 12/01/1983 1100   NA     20     1   700  1200&lt;br /&gt;
 19 7654  CHIRACK  SALESMAN 7698 28/09/1981 1250 1400     30     2  1201  1400&lt;br /&gt;
 23 7521   WALTON  SALESMAN 7698 22/02/1981 1250  500     30     2  1201  1400&lt;br /&gt;
 28 7934   ELISON     CLERK 7782 23/01/1982 1300   NA     10     2  1201  1400&lt;br /&gt;
 34 7499  BAROSSO  SALESMAN 7698 20/02/1981 1600  300     30     3  1401  2000&lt;br /&gt;
 35 7844    GATES  SALESMAN 7698 08/09/1981 1500    0     30     3  1401  2000&lt;br /&gt;
 44 7698    BLAIR   MANAGER 7839 01/05/1981 2850   NA     30     4  2001  3000&lt;br /&gt;
 45 7782   MERKEL   MANAGER 7839 09/06/1981 2450   NA     10     4  2001  3000&lt;br /&gt;
 46 7566    PUTIN   MANAGER 7839 02/04/1981 2975   NA     20     4  2001  3000&lt;br /&gt;
 52 7902    TOOSK   ANALYST 7566 03/12/1981 3000   NA     20     4  2001  3000&lt;br /&gt;
 54 7788 CARNEGIE   ANALYST 7566 09/12/1982 3000   NA     20     4  2001  3000&lt;br /&gt;
 57 7839     BUSH PRESIDENT   NA 17/11/1981 5000   NA     10     5  3001  9999&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Save the joined tables and show only appropriate columns&lt;br /&gt;
 &amp;gt; empsalgrade &amp;lt;- with(empsalgrade,empsalgrade[SAL &amp;gt; LOSAL &amp;amp; SAL &amp;lt; HISAL,])&lt;br /&gt;
 &amp;gt; empsalgrade[c(&amp;quot;ENAME&amp;quot;,&amp;quot;SAL&amp;quot;,&amp;quot;GRADE&amp;quot;)]&lt;br /&gt;
       ENAME  SAL GRADE&lt;br /&gt;
 8   BUFFETT  950     1&lt;br /&gt;
 11 THATCHER  800     1&lt;br /&gt;
 13     FORD 1100     1&lt;br /&gt;
 19  CHIRACK 1250     2&lt;br /&gt;
 23   WALTON 1250     2&lt;br /&gt;
 28   ELISON 1300     2&lt;br /&gt;
 34  BAROSSO 1600     3&lt;br /&gt;
 35    GATES 1500     3&lt;br /&gt;
 44    BLAIR 2850     4&lt;br /&gt;
 45   MERKEL 2450     4&lt;br /&gt;
 46    PUTIN 2975     4&lt;br /&gt;
 57     BUSH 5000     5&lt;br /&gt;
&lt;br /&gt;
== Self-join ==&lt;br /&gt;
We want to know the person&amp;#039;s boss name&lt;br /&gt;
&amp;lt;source lang=&amp;quot;rsplus&amp;quot;&amp;gt;&lt;br /&gt;
m1 &amp;lt;- merge(emp,emp,by.x=&amp;quot;MGR&amp;quot;,by.y=&amp;quot;ID&amp;quot;)[,c(&amp;quot;ENAME.x&amp;quot;,&amp;quot;ENAME.y&amp;quot;)]&lt;br /&gt;
library(plyr)&lt;br /&gt;
rename(m1,c(&amp;quot;ENAME.x&amp;quot; = &amp;quot;Employee&amp;quot;,&amp;quot;ENAME.y&amp;quot; = &amp;quot;Boss&amp;quot;))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
     ENAME.x  ENAME.y&lt;br /&gt;
 1     TOOSK    PUTIN&lt;br /&gt;
 2  CARNEGIE    PUTIN&lt;br /&gt;
 3   CHIRACK    BLAIR&lt;br /&gt;
 4   BAROSSO    BLAIR&lt;br /&gt;
 5     GATES    BLAIR&lt;br /&gt;
 6   BUFFETT    BLAIR&lt;br /&gt;
 7    WALTON    BLAIR&lt;br /&gt;
 8    ELISON   MERKEL&lt;br /&gt;
 9      FORD CARNEGIE&lt;br /&gt;
 10    BLAIR     BUSH&lt;br /&gt;
 11   MERKEL     BUSH&lt;br /&gt;
 12    PUTIN     BUSH&lt;br /&gt;
 13 THATCHER    TOOSK&lt;br /&gt;
&lt;br /&gt;
== Generating Cartesian Product ==&lt;br /&gt;
&lt;br /&gt;
If merge criteria are more complex, you can always generate Cartesian product and use filtering criteria to get results you are interested in.&lt;br /&gt;
 &amp;gt; merge(emp,emp,,all=T,by=NULL)&lt;br /&gt;
     ID.x  ENAME.x     JOB.x MGR.x HIREDATE.x SAL.x COMM.x DEPTNO.x ID.y  ENAME.y     JOB.y MGR.y HIREDATE.y SAL.y COMM.y DEPTNO.y&lt;br /&gt;
 1   7839     BUSH PRESIDENT    NA 1981-11-17  5000     NA       10 7839     BUSH PRESIDENT    NA 1981-11-17  5000     NA       10&lt;br /&gt;
 2   7698    BLAIR   MANAGER  7839 1981-05-01  2850     NA       30 7839     BUSH PRESIDENT    NA 1981-11-17  5000     NA       10&lt;br /&gt;
 ...&lt;br /&gt;
 195 7876     FORD     CLERK  7788 1983-01-12  1100     NA       20 7934   ELISON     CLERK  7782 1982-01-23  1300     NA       10&lt;br /&gt;
 196 7934   ELISON     CLERK  7782 1982-01-23  1300     NA       10 7934   ELISON     CLERK  7782 1982-01-23  1300     NA       10&lt;br /&gt;
&lt;br /&gt;
==Exercises==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;31.  Exercise&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Select the name of the employee and the city (LOC column in DEPT table) in which they work.&lt;br /&gt;
        ENAME      LOC&lt;br /&gt;
 1      BUSH NEW YORK&lt;br /&gt;
 2    ELISON NEW YORK&lt;br /&gt;
 3    MERKEL NEW YORK&lt;br /&gt;
 4     PUTIN   LONDON&lt;br /&gt;
 5  THATCHER   LONDON&lt;br /&gt;
 6  CARNEGIE   LONDON&lt;br /&gt;
 7      FORD   LONDON&lt;br /&gt;
 8     TOOSK   LONDON&lt;br /&gt;
 9   BUFFETT    PARIS&lt;br /&gt;
 10  CHIRACK    PARIS&lt;br /&gt;
 11    BLAIR    PARIS&lt;br /&gt;
 12    GATES    PARIS&lt;br /&gt;
 13   WALTON    PARIS&lt;br /&gt;
 14  BAROSSO    PARIS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;32.  Exercise&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Select the names of the employees, and the name and number of their department.&lt;br /&gt;
       ENAME      DNAME DEPTNO&lt;br /&gt;
 1      BUSH ACCOUNTING     10&lt;br /&gt;
 2    ELISON ACCOUNTING     10&lt;br /&gt;
 3    MERKEL ACCOUNTING     10&lt;br /&gt;
 4     PUTIN   RESEARCH     20&lt;br /&gt;
 5  THATCHER   RESEARCH     20&lt;br /&gt;
 6  CARNEGIE   RESEARCH     20&lt;br /&gt;
 7      FORD   RESEARCH     20&lt;br /&gt;
 8     TOOSK   RESEARCH     20&lt;br /&gt;
 9   BUFFETT      SALES     30&lt;br /&gt;
 10  CHIRACK      SALES     30&lt;br /&gt;
 11    BLAIR      SALES     30&lt;br /&gt;
 12    GATES      SALES     30&lt;br /&gt;
 13   WALTON      SALES     30&lt;br /&gt;
 14  BAROSSO      SALES     30&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;33.  Exercise&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Select the names of the employees, their salary and salary grade, but only those whose salary is more than 2000.&lt;br /&gt;
       ENAME  SAL GRADE&lt;br /&gt;
 44    BLAIR 2850     4&lt;br /&gt;
 45   MERKEL 2450     4&lt;br /&gt;
 46    PUTIN 2975     4&lt;br /&gt;
 52    TOOSK 3000     4&lt;br /&gt;
 54 CARNEGIE 3000     4&lt;br /&gt;
 57     BUSH 5000     5&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;34.  Exercise&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Select employees working in London.&lt;br /&gt;
      ENAME    LOC&lt;br /&gt;
 4    PUTIN LONDON&lt;br /&gt;
 5 THATCHER LONDON&lt;br /&gt;
 6 CARNEGIE LONDON&lt;br /&gt;
 7     FORD LONDON&lt;br /&gt;
 8    TOOSK LONDON&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;35.  Exercise&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Select employees and their salary grades except those from London.&lt;br /&gt;
      ENAME      LOC GRADE&lt;br /&gt;
 1   MERKEL NEW YORK     4&lt;br /&gt;
 2     BUSH NEW YORK     5&lt;br /&gt;
 3   ELISON NEW YORK     2&lt;br /&gt;
 9  BAROSSO    PARIS     3&lt;br /&gt;
 10  WALTON    PARIS     2&lt;br /&gt;
 11 CHIRACK    PARIS     2&lt;br /&gt;
 12   BLAIR    PARIS     4&lt;br /&gt;
 13   GATES    PARIS     3&lt;br /&gt;
 14 BUFFETT    PARIS     1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercises==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;36.  Exercise&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Find departments without employees.&lt;br /&gt;
    DEPTNO      DNAME&lt;br /&gt;
 15     40 OPERATIONS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;37.  *Exercise&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Select an employee’s name and his/her boss’s name.&lt;br /&gt;
    Employee     Boss&lt;br /&gt;
 1     TOOSK    PUTIN&lt;br /&gt;
 2  CARNEGIE    PUTIN&lt;br /&gt;
 3   CHIRACK    BLAIR&lt;br /&gt;
 4   BAROSSO    BLAIR&lt;br /&gt;
 5     GATES    BLAIR&lt;br /&gt;
 6   BUFFETT    BLAIR&lt;br /&gt;
 7    WALTON    BLAIR&lt;br /&gt;
 8    ELISON   MERKEL&lt;br /&gt;
 9      FORD CARNEGIE&lt;br /&gt;
 10    BLAIR     BUSH&lt;br /&gt;
 11   MERKEL     BUSH&lt;br /&gt;
 12    PUTIN     BUSH&lt;br /&gt;
 13 THATCHER    TOOSK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;38.  Exercise&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Select an employee’s name, his/her boss’s name and show the employees who have no superior.&lt;br /&gt;
 &amp;gt; be&lt;br /&gt;
    Employee     Boss&lt;br /&gt;
 1     TOOSK    PUTIN&lt;br /&gt;
 2  CARNEGIE    PUTIN&lt;br /&gt;
 3   CHIRACK    BLAIR&lt;br /&gt;
 4   BAROSSO    BLAIR&lt;br /&gt;
 5     GATES    BLAIR&lt;br /&gt;
 6   BUFFETT    BLAIR&lt;br /&gt;
 7    WALTON    BLAIR&lt;br /&gt;
 8    ELISON   MERKEL&lt;br /&gt;
 9      FORD CARNEGIE&lt;br /&gt;
 10    BLAIR     BUSH&lt;br /&gt;
 11   MERKEL     BUSH&lt;br /&gt;
 12    PUTIN     BUSH&lt;br /&gt;
 13 THATCHER    TOOSK&lt;br /&gt;
 14     BUSH     &amp;lt;NA&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;39.  Exercise&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Select an employee’s name, his/her boss’s name and show all employees even though they have no subordinates.&lt;br /&gt;
&lt;br /&gt;
 +----------+----------+&lt;br /&gt;
 | Employee | Boss     |&lt;br /&gt;
 +----------+----------+&lt;br /&gt;
 | BLAIR    | BUSH     |&lt;br /&gt;
 | MERKEL   | BUSH     |&lt;br /&gt;
 | PUTIN    | BUSH     |&lt;br /&gt;
 | CHIRACK  | BLAIR    |&lt;br /&gt;
 | BAROSSO  | BLAIR    |&lt;br /&gt;
 | GATES    | BLAIR    |&lt;br /&gt;
 | BUFFETT  | BLAIR    |&lt;br /&gt;
 | WALTON   | BLAIR    |&lt;br /&gt;
 | ELISON   | MERKEL   |&lt;br /&gt;
 | TOOSK    | PUTIN    |&lt;br /&gt;
 | CARNEGIE | PUTIN    |&lt;br /&gt;
 |          | CHIRACK  |&lt;br /&gt;
 |          | BAROSSO  |&lt;br /&gt;
 |          | GATES    |&lt;br /&gt;
 |          | BUFFETT  |&lt;br /&gt;
 |          | WALTON   |&lt;br /&gt;
 | THATCHER | TOOSK    |&lt;br /&gt;
 |          | THATCHER |&lt;br /&gt;
 | FORD     | CARNEGIE |&lt;br /&gt;
 |          | FORD     |&lt;br /&gt;
 |          | ELISON   |&lt;br /&gt;
 +----------+----------+&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;40.  Exercise*&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Select an employee’s name, his/her boss’s name and show all employees even though they have no subordinates and also those who have no superior.&lt;br /&gt;
    Employee     Boss&lt;br /&gt;
 1      &amp;lt;NA&amp;gt; THATCHER&lt;br /&gt;
 2      &amp;lt;NA&amp;gt;  BAROSSO&lt;br /&gt;
 3      &amp;lt;NA&amp;gt;   WALTON&lt;br /&gt;
 4     TOOSK    PUTIN&lt;br /&gt;
 5  CARNEGIE    PUTIN&lt;br /&gt;
 6      &amp;lt;NA&amp;gt;  CHIRACK&lt;br /&gt;
 7   CHIRACK    BLAIR&lt;br /&gt;
 8   BAROSSO    BLAIR&lt;br /&gt;
 9     GATES    BLAIR&lt;br /&gt;
 10  BUFFETT    BLAIR&lt;br /&gt;
 11   WALTON    BLAIR&lt;br /&gt;
 12   ELISON   MERKEL&lt;br /&gt;
 13     FORD CARNEGIE&lt;br /&gt;
 14    BLAIR     BUSH&lt;br /&gt;
 15   MERKEL     BUSH&lt;br /&gt;
 16    PUTIN     BUSH&lt;br /&gt;
 17     &amp;lt;NA&amp;gt;    GATES&lt;br /&gt;
 18     &amp;lt;NA&amp;gt;     FORD&lt;br /&gt;
 19     &amp;lt;NA&amp;gt;  BUFFETT&lt;br /&gt;
 20 THATCHER    TOOSK&lt;br /&gt;
 21     &amp;lt;NA&amp;gt;   ELISON&lt;br /&gt;
 22     BUSH     &amp;lt;NA&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;41.  Exercise&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Select employees hired earlier than their bosses.&lt;br /&gt;
    Employee Employee hiredate  Boss Boss hiredate&lt;br /&gt;
 4   BAROSSO        1981-02-20 BLAIR    1981-05-01&lt;br /&gt;
 7    WALTON        1981-02-22 BLAIR    1981-05-01&lt;br /&gt;
 10    BLAIR        1981-05-01  BUSH    1981-11-17&lt;br /&gt;
 11   MERKEL        1981-06-09  BUSH    1981-11-17&lt;br /&gt;
 12    PUTIN        1981-04-02  BUSH    1981-11-17&lt;br /&gt;
 13 THATCHER        1980-12-17 TOOSK    1981-12-03&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;42.  Exercise*&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Show employee, their boss and boss&amp;#039;s boss&lt;br /&gt;
    Employee     Boss BossBoss&lt;br /&gt;
 1      FORD CARNEGIE    PUTIN&lt;br /&gt;
 2  THATCHER    TOOSK    PUTIN&lt;br /&gt;
 3     TOOSK    PUTIN     BUSH&lt;br /&gt;
 4     GATES    BLAIR     BUSH&lt;br /&gt;
 5   CHIRACK    BLAIR     BUSH&lt;br /&gt;
 6   BAROSSO    BLAIR     BUSH&lt;br /&gt;
 7  CARNEGIE    PUTIN     BUSH&lt;br /&gt;
 8    WALTON    BLAIR     BUSH&lt;br /&gt;
 9    ELISON   MERKEL     BUSH&lt;br /&gt;
 10  BUFFETT    BLAIR     BUSH&lt;br /&gt;
 11    BLAIR     BUSH     &amp;lt;NA&amp;gt;&lt;br /&gt;
 12   MERKEL     BUSH     &amp;lt;NA&amp;gt;&lt;br /&gt;
 13    PUTIN     BUSH     &amp;lt;NA&amp;gt;&lt;br /&gt;
 14     BUSH     &amp;lt;NA&amp;gt;     &amp;lt;NA&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set operations ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;UNION&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
In order to combine two data frames we can use &amp;#039;&amp;#039;rbind&amp;#039;&amp;#039; function&lt;br /&gt;
&lt;br /&gt;
We want to see people earning less than 2000 and more than 3000&lt;br /&gt;
 &amp;gt; rbind(emp[SAL&amp;lt;2000,],emp[SAL&amp;gt;3000,])&lt;br /&gt;
     ID    ENAME       JOB  MGR   HIREDATE  SAL COMM DEPTNO&lt;br /&gt;
 5  7654  CHIRACK  SALESMAN 7698 1981-09-28 1250 1400     30&lt;br /&gt;
 6  7499  BAROSSO  SALESMAN 7698 1981-02-20 1600  300     30&lt;br /&gt;
 7  7844    GATES  SALESMAN 7698 1981-09-08 1500    0     30&lt;br /&gt;
 8  7900  BUFFETT     CLERK 7698 1981-12-03  950   NA     30&lt;br /&gt;
 9  7521   WALTON  SALESMAN 7698 1981-02-22 1250  500     30&lt;br /&gt;
 11 7369 THATCHER     CLERK 7902 1980-12-17  800   NA     20&lt;br /&gt;
 13 7876     FORD     CLERK 7788 1983-01-12 1100   NA     20&lt;br /&gt;
 14 7934   ELISON     CLERK 7782 1982-01-23 1300   NA     10&lt;br /&gt;
 91 7839     BUSH PRESIDENT   NA 1981-11-17 5000   NA     10&lt;br /&gt;
&lt;br /&gt;
If we interested only in names&lt;br /&gt;
 &amp;gt; union(emp[SAL&amp;lt;2000,&amp;quot;ENAME&amp;quot;],emp[SAL&amp;gt;3000,&amp;quot;ENAME&amp;quot;])&lt;br /&gt;
 [1] &amp;quot;CHIRACK&amp;quot;  &amp;quot;BAROSSO&amp;quot;  &amp;quot;GATES&amp;quot;    &amp;quot;BUFFETT&amp;quot;  &amp;quot;WALTON&amp;quot;   &amp;quot;THATCHER&amp;quot; &amp;quot;FORD&amp;quot;     &amp;quot;ELISON&amp;quot;   &amp;quot;BUSH&amp;quot;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;INTERSECT Function&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
INTERSECT operator (set intersection) allows you to select rows common for two data frames&lt;br /&gt;
&lt;br /&gt;
Find jobs existing in department 30 and 20 &lt;br /&gt;
 &amp;gt; intersect(emp[DEPTNO==20,&amp;quot;JOB&amp;quot;] ,emp[DEPTNO==30,&amp;quot;JOB&amp;quot;])&lt;br /&gt;
 [1] &amp;quot;MANAGER&amp;quot; &amp;quot;CLERK&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SETDIFF Operator&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
This operator allows to to show rows present in the first query but not present in the second query.&lt;br /&gt;
&lt;br /&gt;
Find jobs in department 30 which do not exist in department 20&lt;br /&gt;
 &amp;gt; setdiff(emp[DEPTNO==30,&amp;quot;JOB&amp;quot;] ,emp[DEPTNO==20,&amp;quot;JOB&amp;quot;])&lt;br /&gt;
 [1] &amp;quot;SALESMAN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Exercises==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;43.  *Exercise&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Find post filled in 1982 and 1983.&lt;br /&gt;
 [1] &amp;quot;CLERK&amp;quot;&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
Answer &amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
 intersect(emp[format(emp$HIREDATE,&amp;quot;%Y&amp;quot;) == 1982,&amp;quot;JOB&amp;quot;] ,emp[format(emp$HIREDATE,&amp;quot;%Y&amp;quot;) == 1981,&amp;quot;JOB&amp;quot;] )&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;44.  ***Exercise&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Find jobs which are in department 10 but not in department 20.&lt;br /&gt;
 [1] &amp;quot;PRESIDENT&amp;quot;&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
Answer &amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt; &amp;gt; setdiff(emp[DEPTNO==10,&amp;quot;JOB&amp;quot;] ,emp[DEPTNO==20,&amp;quot;JOB&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bernard Szlachta</name></author>
	</entry>
</feed>