{ "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 }