{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# IF-THEN/ELSE Statements\n",
    "\n",
    "`IF-THEN` and `IF-THEN/ELSE` statements are conditional statements in SAS that we can use to control the execution of our code. These can be used in a `DATA` step or in open code in a `%macro` with a `%` preceding the key words as illustrated below. \n",
    "\n",
    "In a `DATA` step\n",
    "\n",
    "````{margin}\n",
    "```{tip}\n",
    "If you want to combine conditional statements in SAS, you can use `and` and `or` to represent logical AND and logical OR. You can also use `&` and `|` respectively, as in Stata. I prefer `and` and `or` because I feel they are more conversational and lead to more readable code.\n",
    "```\n",
    "````\n",
    "\n",
    "```sas\n",
    "data out.if_then_example;\n",
    "    set out.fake_micro(keep = pik mom_pik dad_pik);\n",
    "    \n",
    "        * Identify parent status;\n",
    "        if mom_pik ~= \"\" and dad_pik ~= \"\" then singleparent = 0;\n",
    "        else singleparent = 1;  \n",
    "run; \n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "tags": [
     "output_scroll",
     "remove_input"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pik</th>\n",
       "      <th>mom_pik</th>\n",
       "      <th>dad_pik</th>\n",
       "      <th>singleparent</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>141</td>\n",
       "      <td>173</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>138</td>\n",
       "      <td>149</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>177</td>\n",
       "      <td>NaN</td>\n",
       "      <td>003</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>146</td>\n",
       "      <td>013</td>\n",
       "      <td>004</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>104</td>\n",
       "      <td>187</td>\n",
       "      <td>005</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>144</td>\n",
       "      <td>NaN</td>\n",
       "      <td>006</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>083</td>\n",
       "      <td>025</td>\n",
       "      <td>007</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>115</td>\n",
       "      <td>NaN</td>\n",
       "      <td>008</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>170</td>\n",
       "      <td>157</td>\n",
       "      <td>009</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>118</td>\n",
       "      <td>NaN</td>\n",
       "      <td>010</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>085</td>\n",
       "      <td>NaN</td>\n",
       "      <td>011</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>051</td>\n",
       "      <td>058</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>197</td>\n",
       "      <td>156</td>\n",
       "      <td>013</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>054</td>\n",
       "      <td>034</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>139</td>\n",
       "      <td>NaN</td>\n",
       "      <td>015</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>111</td>\n",
       "      <td>004</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>008</td>\n",
       "      <td>NaN</td>\n",
       "      <td>017</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>055</td>\n",
       "      <td>NaN</td>\n",
       "      <td>018</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>167</td>\n",
       "      <td>072</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>160</td>\n",
       "      <td>NaN</td>\n",
       "      <td>020</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>163</td>\n",
       "      <td>112</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>030</td>\n",
       "      <td>NaN</td>\n",
       "      <td>022</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>097</td>\n",
       "      <td>NaN</td>\n",
       "      <td>023</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>026</td>\n",
       "      <td>NaN</td>\n",
       "      <td>024</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>039</td>\n",
       "      <td>NaN</td>\n",
       "      <td>025</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>179</td>\n",
       "      <td>NaN</td>\n",
       "      <td>026</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>154</td>\n",
       "      <td>NaN</td>\n",
       "      <td>027</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>047</td>\n",
       "      <td>NaN</td>\n",
       "      <td>028</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>009</td>\n",
       "      <td>NaN</td>\n",
       "      <td>029</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>103</td>\n",
       "      <td>NaN</td>\n",
       "      <td>030</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>188</td>\n",
       "      <td>NaN</td>\n",
       "      <td>031</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>028</td>\n",
       "      <td>NaN</td>\n",
       "      <td>032</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>041</td>\n",
       "      <td>NaN</td>\n",
       "      <td>033</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>001</td>\n",
       "      <td>NaN</td>\n",
       "      <td>034</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>162</td>\n",
       "      <td>NaN</td>\n",
       "      <td>035</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>064</td>\n",
       "      <td>136</td>\n",
       "      <td>036</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>175</td>\n",
       "      <td>NaN</td>\n",
       "      <td>037</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>183</td>\n",
       "      <td>NaN</td>\n",
       "      <td>038</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>093</td>\n",
       "      <td>NaN</td>\n",
       "      <td>039</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>136</td>\n",
       "      <td>NaN</td>\n",
       "      <td>040</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>140</td>\n",
       "      <td>191</td>\n",
       "      <td>041</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>003</td>\n",
       "      <td>001</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>176</td>\n",
       "      <td>NaN</td>\n",
       "      <td>043</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>108</td>\n",
       "      <td>090</td>\n",
       "      <td>044</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>194</td>\n",
       "      <td>NaN</td>\n",
       "      <td>045</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>187</td>\n",
       "      <td>055</td>\n",
       "      <td>046</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>015</td>\n",
       "      <td>161</td>\n",
       "      <td>047</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>47</th>\n",
       "      <td>062</td>\n",
       "      <td>NaN</td>\n",
       "      <td>048</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>48</th>\n",
       "      <td>130</td>\n",
       "      <td>NaN</td>\n",
       "      <td>049</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49</th>\n",
       "      <td>029</td>\n",
       "      <td>NaN</td>\n",
       "      <td>050</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    pik mom_pik dad_pik  singleparent\n",
       "0   141     173     NaN           1.0\n",
       "1   138     149     NaN           1.0\n",
       "2   177     NaN     003           1.0\n",
       "3   146     013     004           0.0\n",
       "4   104     187     005           0.0\n",
       "5   144     NaN     006           1.0\n",
       "6   083     025     007           0.0\n",
       "7   115     NaN     008           1.0\n",
       "8   170     157     009           0.0\n",
       "9   118     NaN     010           1.0\n",
       "10  085     NaN     011           1.0\n",
       "11  051     058     NaN           1.0\n",
       "12  197     156     013           0.0\n",
       "13  054     034     NaN           1.0\n",
       "14  139     NaN     015           1.0\n",
       "15  111     004     NaN           1.0\n",
       "16  008     NaN     017           1.0\n",
       "17  055     NaN     018           1.0\n",
       "18  167     072     NaN           1.0\n",
       "19  160     NaN     020           1.0\n",
       "20  163     112     NaN           1.0\n",
       "21  030     NaN     022           1.0\n",
       "22  097     NaN     023           1.0\n",
       "23  026     NaN     024           1.0\n",
       "24  039     NaN     025           1.0\n",
       "25  179     NaN     026           1.0\n",
       "26  154     NaN     027           1.0\n",
       "27  047     NaN     028           1.0\n",
       "28  009     NaN     029           1.0\n",
       "29  103     NaN     030           1.0\n",
       "30  188     NaN     031           1.0\n",
       "31  028     NaN     032           1.0\n",
       "32  041     NaN     033           1.0\n",
       "33  001     NaN     034           1.0\n",
       "34  162     NaN     035           1.0\n",
       "35  064     136     036           0.0\n",
       "36  175     NaN     037           1.0\n",
       "37  183     NaN     038           1.0\n",
       "38  093     NaN     039           1.0\n",
       "39  136     NaN     040           1.0\n",
       "40  140     191     041           0.0\n",
       "41  003     001     NaN           1.0\n",
       "42  176     NaN     043           1.0\n",
       "43  108     090     044           0.0\n",
       "44  194     NaN     045           1.0\n",
       "45  187     055     046           0.0\n",
       "46  015     161     047           0.0\n",
       "47  062     NaN     048           1.0\n",
       "48  130     NaN     049           1.0\n",
       "49  029     NaN     050           1.0"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "example = pd.read_sas(\"../data/if_then_example.sas7bdat\", encoding=\"latin-1\");\n",
    "example.head(n=50)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "tags": [
     "output_scroll"
    ]
   },
   "source": [
    "And in open code \n",
    "\n",
    "````{margin}\n",
    "```{tip}\n",
    "`%sysfunc` lets you evaluate `DATA` step functions in open code. Here we use it to call the SAS modulo function `mod`\n",
    "```\n",
    "````"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```sas\n",
    "%macro ifthen(year);\n",
    "\n",
    "    %if %sysfunc(mod(&year, 2)) = 0 %then %put Even.;\n",
    "    %else %put Odd.;\n",
    "\n",
    "%mend ifthen;\n",
    "\n",
    "%ifthen(1);\n",
    "%ifthen(2);\n",
    "```\n",
    "```\n",
    "581  %ifthen(1);\n",
    "Odd.\n",
    "582  %ifthen(2);\n",
    "Even.\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## IF-THEN/ELSE DO Statements\n",
    "\n",
    "Sometimes we want to execute a series of statements depending on a certain condition rather than just one statement. In these instances, we use `IF-THEN/ELSE DO` statements. The syntax for these statements in a `DATA` step is:\n",
    "```sas\n",
    "data out.output;\n",
    "    set in.input;\n",
    "    \n",
    "    * IF-THEN DO;\n",
    "    if (cond) then do;\n",
    "        /* SAS statements if condition is met */\n",
    "    end;\n",
    "    \n",
    "    * IF-THEN/ELSE DO;\n",
    "    if (cond) then do;\n",
    "        /* SAS statements if condition is met */\n",
    "    end;\n",
    "    else do;\n",
    "        /* SAS statements if condition is not met */\n",
    "    end;\n",
    "run;\n",
    "```\n",
    "\n",
    "Or in open code (wrapped in a `%macro`)\n",
    "```sas\n",
    "* IF-THEN DO;\n",
    "%macro ifthendo;\n",
    "    %if (cond) %then %do;\n",
    "        /* SAS statements if condition is met */\n",
    "    %end;\n",
    "\n",
    "    * IF-THEN/ELSE DO;\n",
    "    %if (cond) %then %do;\n",
    "        /* SAS statements if condition is met */\n",
    "    %end;\n",
    "    %else %do;\n",
    "        /* SAS statements if condition is not met */\n",
    "    %end;\n",
    "%mend ifthendo;\n",
    "```\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}