Chapter 20: R – AND OR Operators
Part 1: The Core Operators – What They Are
In R, we have two main types of logical operators: element-wise and single-value operators. Let’s start with the basics.
The AND Operators
-
&(Element-wise AND) – Compares each corresponding element of vectors -
&&(Single-value AND) – Compares only the first element of each vector
The OR Operators
-
|(Element-wise OR) – Compares each corresponding element of vectors -
||(Single-value OR) – Compares only the first element of each vector
The NOT Operator
-
!(NOT) – Reverses logical values (TRUE becomes FALSE, FALSE becomes TRUE)
Part 2: Understanding AND (& and &&)
The Element-wise AND (&)
The & operator compares each element of two vectors and returns a vector of TRUE/FALSE values. Both conditions must be TRUE for the result to be TRUE.
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment"># Basic AND operations</span> <span class="token boolean">TRUE</span> <span class="token operator">&</span> <span class="token boolean">TRUE</span> <span class="token comment"># Returns TRUE</span> <span class="token boolean">TRUE</span> <span class="token operator">&</span> <span class="token boolean">FALSE</span> <span class="token comment"># Returns FALSE</span> <span class="token boolean">FALSE</span> <span class="token operator">&</span> <span class="token boolean">TRUE</span> <span class="token comment"># Returns FALSE</span> <span class="token boolean">FALSE</span> <span class="token operator">&</span> <span class="token boolean">FALSE</span> <span class="token comment"># Returns FALSE</span> |
Now let’s see it with actual data:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment"># Create two logical vectors</span> condition1 <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">)</span> condition2 <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">)</span> <span class="token comment"># Element-wise AND</span> result <span class="token operator"><-</span> condition1 <span class="token operator">&</span> condition2 print<span class="token punctuation">(</span>result<span class="token punctuation">)</span> |
Output: [1] TRUE FALSE FALSE FALSE
Let’s trace each element:
-
Element 1: TRUE & TRUE = TRUE
-
Element 2: TRUE & FALSE = FALSE
-
Element 3: FALSE & TRUE = FALSE
-
Element 4: FALSE & FALSE = FALSE
Real-world Example with Numbers
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment"># Create some data</span> ages <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token number">25</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">35</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">,</span> <span class="token number">42</span><span class="token punctuation">)</span> has_license <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">)</span> <span class="token comment"># Who is at least 18 AND has a license?</span> can_drive <span class="token operator"><-</span> ages <span class="token operator">>=</span> <span class="token number">18</span> <span class="token operator">&</span> has_license print<span class="token punctuation">(</span>can_drive<span class="token punctuation">)</span> |
Output: [1] TRUE FALSE TRUE FALSE TRUE
Let’s see the data in a table format:
| Person | Age | Age >= 18 | Has License | Can Drive (AND) |
|---|---|---|---|---|
| 1 | 25 | TRUE | TRUE | TRUE |
| 2 | 17 | FALSE | FALSE | FALSE |
| 3 | 35 | TRUE | TRUE | TRUE |
| 4 | 16 | FALSE | FALSE | FALSE |
| 5 | 42 | TRUE | TRUE | TRUE |
The Single-value AND (&&)
The && operator only looks at the FIRST element of each vector and returns a single TRUE/FALSE value. It’s typically used in if statements where you’re checking a single condition.
|
0 1 2 3 4 5 6 7 8 9 10 11 |
<span class="token comment"># && ignores everything after the first element</span> condition1 <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">)</span> condition2 <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">)</span> result <span class="token operator"><-</span> condition1 <span class="token operator">&&</span> condition2 print<span class="token punctuation">(</span>result<span class="token punctuation">)</span> <span class="token comment"># Only checks first elements: TRUE && FALSE = FALSE</span> |
Output: [1] FALSE
Important Difference: & vs &&
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<span class="token comment"># Using & with vectors (vectorized operation)</span> x <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">)</span> y <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">)</span> x <span class="token operator">&</span> y <span class="token comment"># Returns: TRUE FALSE FALSE</span> <span class="token comment"># Using && with vectors (only first element)</span> x <span class="token operator">&&</span> y <span class="token comment"># Returns: TRUE (only checks x[1] and y[1])</span> <span class="token comment"># In if statements, && is usually what you want</span> age <span class="token operator"><-</span> <span class="token number">25</span> has_id <span class="token operator"><-</span> <span class="token boolean">TRUE</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>age <span class="token operator">>=</span> <span class="token number">18</span> <span class="token operator">&&</span> has_id<span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"You can vote!"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Part 3: Understanding OR (| and ||)
The Element-wise OR (|)
The | operator returns TRUE if at least one condition is TRUE.
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment"># Basic OR operations</span> <span class="token boolean">TRUE</span> <span class="token operator">|</span> <span class="token boolean">TRUE</span> <span class="token comment"># Returns TRUE</span> <span class="token boolean">TRUE</span> <span class="token operator">|</span> <span class="token boolean">FALSE</span> <span class="token comment"># Returns TRUE</span> <span class="token boolean">FALSE</span> <span class="token operator">|</span> <span class="token boolean">TRUE</span> <span class="token comment"># Returns TRUE</span> <span class="token boolean">FALSE</span> <span class="token operator">|</span> <span class="token boolean">FALSE</span> <span class="token comment"># Returns FALSE</span> |
Vector example:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment"># Create two logical vectors</span> condition1 <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">)</span> condition2 <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">)</span> <span class="token comment"># Element-wise OR</span> result <span class="token operator"><-</span> condition1 <span class="token operator">|</span> condition2 print<span class="token punctuation">(</span>result<span class="token punctuation">)</span> |
Output: [1] TRUE TRUE TRUE FALSE
Tracing each element:
-
Element 1: TRUE | TRUE = TRUE
-
Element 2: TRUE | FALSE = TRUE
-
Element 3: FALSE | TRUE = TRUE
-
Element 4: FALSE | FALSE = FALSE
Real-world Example with Numbers
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment"># Discount eligibility: spend > $100 OR be a premium member</span> spend <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">,</span> <span class="token number">150</span><span class="token punctuation">,</span> <span class="token number">80</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">30</span><span class="token punctuation">)</span> is_premium <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">)</span> <span class="token comment"># Who gets a discount?</span> gets_discount <span class="token operator"><-</span> spend <span class="token operator">></span> <span class="token number">100</span> <span class="token operator">|</span> is_premium print<span class="token punctuation">(</span>gets_discount<span class="token punctuation">)</span> |
Output: [1] FALSE TRUE TRUE TRUE FALSE
Let’s see why:
| Person | Spend | Spend > $100 | Premium | Gets Discount (OR) |
|---|---|---|---|---|
| 1 | $50 | FALSE | FALSE | FALSE |
| 2 | $150 | TRUE | FALSE | TRUE |
| 3 | $80 | FALSE | TRUE | TRUE |
| 4 | $200 | TRUE | TRUE | TRUE |
| 5 | $30 | FALSE | FALSE | FALSE |
The Single-value OR (||)
Like &&, || only looks at the first element:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<span class="token comment"># || only checks first elements</span> x <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">)</span> y <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">)</span> x <span class="token operator">||</span> y <span class="token comment"># Returns: TRUE (TRUE || FALSE = TRUE)</span> <span class="token comment"># In practice, use || for single conditions</span> temperature <span class="token operator"><-</span> <span class="token number">25</span> is_raining <span class="token operator"><-</span> <span class="token boolean">FALSE</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>temperature <span class="token operator">></span> <span class="token number">30</span> <span class="token operator">||</span> is_raining<span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Stay inside!"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Nice weather for a walk!"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Part 4: The NOT Operator (!)
The ! operator negates logical values – it flips TRUE to FALSE and vice versa.
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<span class="token comment"># Basic NOT operations</span> <span class="token operator">!</span><span class="token boolean">TRUE</span> <span class="token comment"># Returns FALSE</span> <span class="token operator">!</span><span class="token boolean">FALSE</span> <span class="token comment"># Returns TRUE</span> <span class="token comment"># With vectors</span> values <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">)</span> <span class="token operator">!</span>values <span class="token comment"># Returns: FALSE TRUE FALSE TRUE</span> <span class="token comment"># Real-world example</span> students <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token string">"Passed"</span><span class="token punctuation">,</span> <span class="token string">"Failed"</span><span class="token punctuation">,</span> <span class="token string">"Passed"</span><span class="token punctuation">,</span> <span class="token string">"Failed"</span><span class="token punctuation">,</span> <span class="token string">"Passed"</span><span class="token punctuation">)</span> passed <span class="token operator"><-</span> students <span class="token operator">==</span> <span class="token string">"Passed"</span> failed <span class="token operator"><-</span> <span class="token operator">!</span>passed <span class="token comment"># Students who didn't pass</span> print<span class="token punctuation">(</span>passed<span class="token punctuation">)</span> <span class="token comment"># TRUE FALSE TRUE FALSE TRUE</span> print<span class="token punctuation">(</span>failed<span class="token punctuation">)</span> <span class="token comment"># FALSE TRUE FALSE TRUE FALSE</span> |
Combining NOT with AND/OR
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="token comment"># Find people who are NOT adults (age < 18)</span> ages <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token number">25</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">35</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">,</span> <span class="token number">42</span><span class="token punctuation">)</span> not_adults <span class="token operator"><-</span> <span class="token operator">!</span><span class="token punctuation">(</span>ages <span class="token operator">>=</span> <span class="token number">18</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>not_adults<span class="token punctuation">)</span> <span class="token comment"># FALSE TRUE FALSE TRUE FALSE</span> <span class="token comment"># Find people who can drive (age >= 18) AND do NOT have a license</span> has_license <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">)</span> can_drive_but_no_license <span class="token operator"><-</span> ages <span class="token operator">>=</span> <span class="token number">18</span> <span class="token operator">&</span> <span class="token operator">!</span>has_license print<span class="token punctuation">(</span>can_drive_but_no_license<span class="token punctuation">)</span> <span class="token comment"># FALSE FALSE FALSE FALSE FALSE</span> |
Part 5: Operator Precedence and Parentheses
Just like in math, logical operators have an order of operations. The NOT operator (!) has the highest precedence, followed by AND (&), then OR (|).
Using Parentheses for Clarity
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<span class="token comment"># Without parentheses - follows precedence rules</span> <span class="token comment"># ! has highest precedence, then &, then |</span> result <span class="token operator"><-</span> <span class="token operator">!</span><span class="token boolean">TRUE</span> <span class="token operator">&</span> <span class="token boolean">FALSE</span> <span class="token operator">|</span> <span class="token boolean">TRUE</span> <span class="token comment"># Step 1: !TRUE = FALSE</span> <span class="token comment"># Step 2: FALSE & FALSE = FALSE</span> <span class="token comment"># Step 3: FALSE | TRUE = TRUE</span> print<span class="token punctuation">(</span>result<span class="token punctuation">)</span> <span class="token comment"># TRUE</span> <span class="token comment"># With parentheses - much clearer!</span> result <span class="token operator"><-</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token boolean">TRUE</span><span class="token punctuation">)</span> <span class="token operator">&</span> <span class="token boolean">FALSE</span><span class="token punctuation">)</span> <span class="token operator">|</span> <span class="token boolean">TRUE</span> print<span class="token punctuation">(</span>result<span class="token punctuation">)</span> <span class="token comment"># TRUE</span> <span class="token comment"># Parentheses can change the logic completely</span> x <span class="token operator"><-</span> <span class="token boolean">TRUE</span> y <span class="token operator"><-</span> <span class="token boolean">FALSE</span> z <span class="token operator"><-</span> <span class="token boolean">TRUE</span> <span class="token comment"># Different grouping gives different results</span> result1 <span class="token operator"><-</span> x <span class="token operator">&</span> <span class="token punctuation">(</span>y <span class="token operator">|</span> z<span class="token punctuation">)</span> <span class="token comment"># TRUE & (FALSE | TRUE) = TRUE & TRUE = TRUE</span> result2 <span class="token operator"><-</span> <span class="token punctuation">(</span>x <span class="token operator">&</span> y<span class="token punctuation">)</span> <span class="token operator">|</span> z <span class="token comment"># (TRUE & FALSE) | TRUE = FALSE | TRUE = TRUE</span> <span class="token comment"># Actually they give the same result here, but the logic is different</span> |
Always Use Parentheses for Complex Conditions
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment"># Hard to read and error-prone</span> eligibility <span class="token operator"><-</span> age <span class="token operator">>=</span> <span class="token number">18</span> <span class="token operator">&</span> has_license <span class="token operator">|</span> is_vip <span class="token operator">&</span> <span class="token operator">!</span>blacklisted <span class="token comment"># Much clearer with parentheses</span> eligibility <span class="token operator"><-</span> <span class="token punctuation">(</span>age <span class="token operator">>=</span> <span class="token number">18</span> <span class="token operator">&</span> has_license<span class="token punctuation">)</span> <span class="token operator">|</span> <span class="token punctuation">(</span>is_vip <span class="token operator">&</span> <span class="token operator">!</span>blacklisted<span class="token punctuation">)</span> |
Part 6: Real-World Examples
Example 1: Loan Approval System
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<span class="token comment"># Loan applicant data</span> applicants <span class="token operator"><-</span> data.frame<span class="token punctuation">(</span> name <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token string">"Alice"</span><span class="token punctuation">,</span> <span class="token string">"Bob"</span><span class="token punctuation">,</span> <span class="token string">"Charlie"</span><span class="token punctuation">,</span> <span class="token string">"Diana"</span><span class="token punctuation">,</span> <span class="token string">"Eve"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> credit_score <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">750</span><span class="token punctuation">,</span> <span class="token number">620</span><span class="token punctuation">,</span> <span class="token number">680</span><span class="token punctuation">,</span> <span class="token number">710</span><span class="token punctuation">,</span> <span class="token number">590</span><span class="token punctuation">)</span><span class="token punctuation">,</span> annual_income <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">60000</span><span class="token punctuation">,</span> <span class="token number">45000</span><span class="token punctuation">,</span> <span class="token number">55000</span><span class="token punctuation">,</span> <span class="token number">80000</span><span class="token punctuation">,</span> <span class="token number">35000</span><span class="token punctuation">)</span><span class="token punctuation">,</span> existing_loans <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span> employment_years <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment"># Loan approval criteria:</span> <span class="token comment"># - Credit score >= 650 OR annual income >= 50000</span> <span class="token comment"># - AND existing loans <= 1</span> <span class="token comment"># - AND employment years >= 2</span> applicants<span class="token operator">$</span>approved <span class="token operator"><-</span> <span class="token punctuation">(</span>applicants<span class="token operator">$</span>credit_score <span class="token operator">>=</span> <span class="token number">650</span> <span class="token operator">|</span> applicants<span class="token operator">$</span>annual_income <span class="token operator">>=</span> <span class="token number">50000</span><span class="token punctuation">)</span> <span class="token operator">&</span> applicants<span class="token operator">$</span>existing_loans <span class="token operator"><=</span> <span class="token number">1</span> <span class="token operator">&</span> applicants<span class="token operator">$</span>employment_years <span class="token operator">>=</span> <span class="token number">2</span> print<span class="token punctuation">(</span>applicants<span class="token punctuation">[</span><span class="token punctuation">,</span> c<span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">,</span> <span class="token string">"approved"</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span> |
Output:
| name | approved |
|---|---|
| Alice | TRUE |
| Bob | FALSE |
| Charlie | FALSE |
| Diana | TRUE |
| Eve | FALSE |
Let’s verify each applicant:
-
Alice: Credit 750 (TRUE), income 60000 (TRUE), loans 0 (TRUE), years 5 (TRUE) = TRUE
-
Bob: Credit 620 (FALSE), income 45000 (FALSE), loans 1 (TRUE), years 2 (TRUE) = FALSE (fails first condition)
-
Charlie: Credit 680 (TRUE), income 55000 (TRUE), loans 2 (FALSE), years 3 (TRUE) = FALSE (fails loans condition)
-
Diana: Credit 710 (TRUE), income 80000 (TRUE), loans 0 (TRUE), years 8 (TRUE) = TRUE
-
Eve: Credit 590 (FALSE), income 35000 (FALSE), loans 3 (FALSE), years 1 (FALSE) = FALSE (fails everything)
Example 2: Marketing Campaign Targeting
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<span class="token comment"># Customer data for email campaign</span> customers <span class="token operator"><-</span> data.frame<span class="token punctuation">(</span> customer_id <span class="token operator">=</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">10</span><span class="token punctuation">,</span> age <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">25</span><span class="token punctuation">,</span> <span class="token number">45</span><span class="token punctuation">,</span> <span class="token number">62</span><span class="token punctuation">,</span> <span class="token number">19</span><span class="token punctuation">,</span> <span class="token number">35</span><span class="token punctuation">,</span> <span class="token number">28</span><span class="token punctuation">,</span> <span class="token number">52</span><span class="token punctuation">,</span> <span class="token number">41</span><span class="token punctuation">,</span> <span class="token number">33</span><span class="token punctuation">,</span> <span class="token number">55</span><span class="token punctuation">)</span><span class="token punctuation">,</span> purchase_history <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">1200</span><span class="token punctuation">,</span> <span class="token number">5000</span><span class="token punctuation">,</span> <span class="token number">3000</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">2800</span><span class="token punctuation">,</span> <span class="token number">900</span><span class="token punctuation">,</span> <span class="token number">4500</span><span class="token punctuation">,</span> <span class="token number">3200</span><span class="token punctuation">,</span> <span class="token number">1500</span><span class="token punctuation">,</span> <span class="token number">6000</span><span class="token punctuation">)</span><span class="token punctuation">,</span> email_opt_in <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">)</span><span class="token punctuation">,</span> last_purchase_months <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment"># Target criteria:</span> <span class="token comment"># - Age between 25 and 55 (inclusive)</span> <span class="token comment"># - AND (purchase_history > 2000 OR email_opt_in = TRUE)</span> <span class="token comment"># - AND last_purchase_months <= 6</span> customers<span class="token operator">$</span>target <span class="token operator"><-</span> <span class="token punctuation">(</span>customers<span class="token operator">$</span>age <span class="token operator">>=</span> <span class="token number">25</span> <span class="token operator">&</span> customers<span class="token operator">$</span>age <span class="token operator"><=</span> <span class="token number">55</span><span class="token punctuation">)</span> <span class="token operator">&</span> <span class="token punctuation">(</span>customers<span class="token operator">$</span>purchase_history <span class="token operator">></span> <span class="token number">2000</span> <span class="token operator">|</span> customers<span class="token operator">$</span>email_opt_in<span class="token punctuation">)</span> <span class="token operator">&</span> customers<span class="token operator">$</span>last_purchase_months <span class="token operator"><=</span> <span class="token number">6</span> <span class="token comment"># View results</span> targeted_customers <span class="token operator"><-</span> customers<span class="token punctuation">[</span>customers<span class="token operator">$</span>target<span class="token punctuation">,</span> c<span class="token punctuation">(</span><span class="token string">"customer_id"</span><span class="token punctuation">,</span> <span class="token string">"age"</span><span class="token punctuation">,</span> <span class="token string">"purchase_history"</span><span class="token punctuation">)</span><span class="token punctuation">]</span> print<span class="token punctuation">(</span>targeted_customers<span class="token punctuation">)</span> |
Example 3: Quality Control System
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<span class="token comment"># Product inspection data</span> products <span class="token operator"><-</span> data.frame<span class="token punctuation">(</span> product_id <span class="token operator">=</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">8</span><span class="token punctuation">,</span> weight_grams <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">250</span><span class="token punctuation">,</span> <span class="token number">248</span><span class="token punctuation">,</span> <span class="token number">252</span><span class="token punctuation">,</span> <span class="token number">245</span><span class="token punctuation">,</span> <span class="token number">251</span><span class="token punctuation">,</span> <span class="token number">249</span><span class="token punctuation">,</span> <span class="token number">247</span><span class="token punctuation">,</span> <span class="token number">253</span><span class="token punctuation">)</span><span class="token punctuation">,</span> diameter_mm <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">,</span> <span class="token number">101</span><span class="token punctuation">,</span> <span class="token number">98</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">102</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">,</span> surface_defects <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> tested <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment"># Quality standards:</span> <span class="token comment"># - Weight must be between 248 and 252 grams</span> <span class="token comment"># - Diameter must be between 99 and 101 mm</span> <span class="token comment"># - No surface defects</span> <span class="token comment"># - Must have been tested</span> products<span class="token operator">$</span>passes_qc <span class="token operator"><-</span> <span class="token punctuation">(</span>products<span class="token operator">$</span>weight_grams <span class="token operator">>=</span> <span class="token number">248</span> <span class="token operator">&</span> products<span class="token operator">$</span>weight_grams <span class="token operator"><=</span> <span class="token number">252</span><span class="token punctuation">)</span> <span class="token operator">&</span> <span class="token punctuation">(</span>products<span class="token operator">$</span>diameter_mm <span class="token operator">>=</span> <span class="token number">99</span> <span class="token operator">&</span> products<span class="token operator">$</span>diameter_mm <span class="token operator"><=</span> <span class="token number">101</span><span class="token punctuation">)</span> <span class="token operator">&</span> products<span class="token operator">$</span>surface_defects <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">&</span> products<span class="token operator">$</span>tested <span class="token operator">==</span> <span class="token boolean">TRUE</span> print<span class="token punctuation">(</span>products<span class="token punctuation">[</span><span class="token punctuation">,</span> c<span class="token punctuation">(</span><span class="token string">"product_id"</span><span class="token punctuation">,</span> <span class="token string">"passes_qc"</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span> |
Example 4: Dynamic Pricing Engine
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<span class="token comment"># Hotel room pricing based on multiple factors</span> rooms <span class="token operator"><-</span> data.frame<span class="token punctuation">(</span> room_id <span class="token operator">=</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">6</span><span class="token punctuation">,</span> base_price <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">150</span><span class="token punctuation">,</span> <span class="token number">300</span><span class="token punctuation">,</span> <span class="token number">250</span><span class="token punctuation">,</span> <span class="token number">180</span><span class="token punctuation">,</span> <span class="token number">220</span><span class="token punctuation">)</span><span class="token punctuation">,</span> is_weekend <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">)</span><span class="token punctuation">,</span> occupancy_rate <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">0.8</span><span class="token punctuation">,</span> <span class="token number">0.6</span><span class="token punctuation">,</span> <span class="token number">0.9</span><span class="token punctuation">,</span> <span class="token number">0.7</span><span class="token punctuation">,</span> <span class="token number">0.85</span><span class="token punctuation">,</span> <span class="token number">0.5</span><span class="token punctuation">)</span><span class="token punctuation">,</span> has_balcony <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">)</span><span class="token punctuation">,</span> last_minute <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment"># Pricing rules:</span> <span class="token comment"># - Weekend AND occupancy > 0.8: price = base_price * 1.2</span> <span class="token comment"># - Weekend OR (occupancy > 0.7 AND has_balcony): price = base_price * 1.1</span> <span class="token comment"># - last_minute AND occupancy < 0.6: price = base_price * 0.8</span> <span class="token comment"># - Otherwise: price = base_price</span> rooms<span class="token operator">$</span>final_price <span class="token operator"><-</span> ifelse<span class="token punctuation">(</span> rooms<span class="token operator">$</span>is_weekend <span class="token operator">&</span> rooms<span class="token operator">$</span>occupancy_rate <span class="token operator">></span> <span class="token number">0.8</span><span class="token punctuation">,</span> rooms<span class="token operator">$</span>base_price <span class="token operator">*</span> <span class="token number">1.2</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span> rooms<span class="token operator">$</span>is_weekend <span class="token operator">|</span> <span class="token punctuation">(</span>rooms<span class="token operator">$</span>occupancy_rate <span class="token operator">></span> <span class="token number">0.7</span> <span class="token operator">&</span> rooms<span class="token operator">$</span>has_balcony<span class="token punctuation">)</span><span class="token punctuation">,</span> rooms<span class="token operator">$</span>base_price <span class="token operator">*</span> <span class="token number">1.1</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span> rooms<span class="token operator">$</span>last_minute <span class="token operator">&</span> rooms<span class="token operator">$</span>occupancy_rate <span class="token operator"><</span> <span class="token number">0.6</span><span class="token punctuation">,</span> rooms<span class="token operator">$</span>base_price <span class="token operator">*</span> <span class="token number">0.8</span><span class="token punctuation">,</span> rooms<span class="token operator">$</span>base_price <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> print<span class="token punctuation">(</span>rooms<span class="token punctuation">[</span><span class="token punctuation">,</span> c<span class="token punctuation">(</span><span class="token string">"room_id"</span><span class="token punctuation">,</span> <span class="token string">"base_price"</span><span class="token punctuation">,</span> <span class="token string">"final_price"</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span> |
Part 7: Vectorized Operations vs. Control Flow
Understanding when to use vectorized operations (&, |) vs. control flow (&&, ||, if statements) is crucial.
Vectorized Operations (with & and |)
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="token comment"># Use these when working with entire vectors</span> ages <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token number">25</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">35</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">,</span> <span class="token number">42</span><span class="token punctuation">)</span> has_license <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">)</span> <span class="token comment"># Vectorized - returns a vector of results</span> can_drive <span class="token operator"><-</span> ages <span class="token operator">>=</span> <span class="token number">18</span> <span class="token operator">&</span> has_license print<span class="token punctuation">(</span>can_drive<span class="token punctuation">)</span> <span class="token comment"># [1] TRUE FALSE TRUE FALSE TRUE</span> <span class="token comment"># Perfect for creating new columns in data frames</span> df<span class="token operator">$</span>can_drive <span class="token operator"><-</span> df<span class="token operator">$</span>age <span class="token operator">>=</span> <span class="token number">18</span> <span class="token operator">&</span> df<span class="token operator">$</span>has_license |
Control Flow (with && and ||)
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<span class="token comment"># Use these in if statements for single conditions</span> age <span class="token operator"><-</span> <span class="token number">25</span> has_license <span class="token operator"><-</span> <span class="token boolean">TRUE</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>age <span class="token operator">>=</span> <span class="token number">18</span> <span class="token operator">&&</span> has_license<span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"You can drive!"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># Also useful in while loops</span> attempts <span class="token operator"><-</span> <span class="token number">0</span> max_attempts <span class="token operator"><-</span> <span class="token number">3</span> success <span class="token operator"><-</span> <span class="token boolean">FALSE</span> <span class="token keyword">while</span> <span class="token punctuation">(</span>attempts <span class="token operator"><</span> max_attempts <span class="token operator">&&</span> <span class="token operator">!</span>success<span class="token punctuation">)</span> <span class="token punctuation">{</span> attempts <span class="token operator"><-</span> attempts <span class="token operator">+</span> <span class="token number">1</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Attempt"</span><span class="token punctuation">,</span> attempts<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># Try something...</span> success <span class="token operator"><-</span> runif<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">0.7</span> <span class="token comment"># Random success</span> <span class="token punctuation">}</span> |
Common Mistake: Using && with Vectors in if Statements
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<span class="token comment"># ❌ This doesn't do what you might think</span> ages <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token number">25</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">35</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>ages <span class="token operator">>=</span> <span class="token number">18</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Warning! Only first element used</span> print<span class="token punctuation">(</span><span class="token string">"All adults?"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># ✅ Use any() or all() for vector conditions</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>all<span class="token punctuation">(</span>ages <span class="token operator">>=</span> <span class="token number">18</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Everyone is an adult"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>any<span class="token punctuation">(</span>ages <span class="token operator"><</span> <span class="token number">18</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Some minors present"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># ✅ Or use vectorized operations with ifelse()</span> status <span class="token operator"><-</span> ifelse<span class="token punctuation">(</span>ages <span class="token operator">>=</span> <span class="token number">18</span><span class="token punctuation">,</span> <span class="token string">"Adult"</span><span class="token punctuation">,</span> <span class="token string">"Minor"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>status<span class="token punctuation">)</span> |
Part 8: Combining with any() and all()
The any() and all() functions are perfect partners for logical operators when you need to summarize vector results.
any() – Is at least one TRUE?
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
test_scores <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token number">65</span><span class="token punctuation">,</span> <span class="token number">82</span><span class="token punctuation">,</span> <span class="token number">47</span><span class="token punctuation">,</span> <span class="token number">91</span><span class="token punctuation">,</span> <span class="token number">73</span><span class="token punctuation">)</span> <span class="token comment"># Did anyone score above 90?</span> any<span class="token punctuation">(</span>test_scores <span class="token operator">></span> <span class="token number">90</span><span class="token punctuation">)</span> <span class="token comment"># TRUE (91 is > 90)</span> <span class="token comment"># Did anyone fail? (below 60)</span> any<span class="token punctuation">(</span>test_scores <span class="token operator"><</span> <span class="token number">60</span><span class="token punctuation">)</span> <span class="token comment"># TRUE (47 is < 60)</span> <span class="token comment"># Did anyone score exactly 100?</span> any<span class="token punctuation">(</span>test_scores <span class="token operator">==</span> <span class="token number">100</span><span class="token punctuation">)</span> <span class="token comment"># FALSE</span> |
all() – Are all TRUE?
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment"># Did everyone pass? (above 60)</span> all<span class="token punctuation">(</span>test_scores <span class="token operator">></span> <span class="token number">60</span><span class="token punctuation">)</span> <span class="token comment"># FALSE (47 is not > 60)</span> <span class="token comment"># Are all scores between 0 and 100?</span> all<span class="token punctuation">(</span>test_scores <span class="token operator">>=</span> <span class="token number">0</span> <span class="token operator">&</span> test_scores <span class="token operator"><=</span> <span class="token number">100</span><span class="token punctuation">)</span> <span class="token comment"># TRUE</span> <span class="token comment"># Did everyone score at least 40?</span> all<span class="token punctuation">(</span>test_scores <span class="token operator">>=</span> <span class="token number">40</span><span class="token punctuation">)</span> <span class="token comment"># TRUE</span> |
Real-world Example: Quality Assurance
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<span class="token comment"># Manufacturing quality check</span> measurements <span class="token operator"><-</span> data.frame<span class="token punctuation">(</span> part_id <span class="token operator">=</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">5</span><span class="token punctuation">,</span> length <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">10.1</span><span class="token punctuation">,</span> <span class="token number">9.9</span><span class="token punctuation">,</span> <span class="token number">10.0</span><span class="token punctuation">,</span> <span class="token number">10.2</span><span class="token punctuation">,</span> <span class="token number">9.8</span><span class="token punctuation">)</span><span class="token punctuation">,</span> width <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">5.0</span><span class="token punctuation">,</span> <span class="token number">5.1</span><span class="token punctuation">,</span> <span class="token number">4.9</span><span class="token punctuation">,</span> <span class="token number">5.0</span><span class="token punctuation">,</span> <span class="token number">5.0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> weight <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">,</span> <span class="token number">101</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment"># Tolerance ranges</span> length_ok <span class="token operator"><-</span> measurements<span class="token operator">$</span>length <span class="token operator">>=</span> <span class="token number">9.8</span> <span class="token operator">&</span> measurements<span class="token operator">$</span>length <span class="token operator"><=</span> <span class="token number">10.2</span> width_ok <span class="token operator"><-</span> measurements<span class="token operator">$</span>width <span class="token operator">>=</span> <span class="token number">4.9</span> <span class="token operator">&</span> measurements<span class="token operator">$</span>width <span class="token operator"><=</span> <span class="token number">5.1</span> weight_ok <span class="token operator"><-</span> measurements<span class="token operator">$</span>weight <span class="token operator">>=</span> <span class="token number">98</span> <span class="token operator">&</span> measurements<span class="token operator">$</span>weight <span class="token operator"><=</span> <span class="token number">102</span> <span class="token comment"># All checks must pass</span> measurements<span class="token operator">$</span>all_ok <span class="token operator"><-</span> length_ok <span class="token operator">&</span> width_ok <span class="token operator">&</span> weight_ok <span class="token comment"># Batch quality summary</span> cat<span class="token punctuation">(</span><span class="token string">"Batch Quality Report:\n"</span><span class="token punctuation">)</span> cat<span class="token punctuation">(</span><span class="token string">"All parts within specs:"</span><span class="token punctuation">,</span> all<span class="token punctuation">(</span>measurements<span class="token operator">$</span>all_ok<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"\n"</span><span class="token punctuation">)</span> cat<span class="token punctuation">(</span><span class="token string">"Any parts out of spec:"</span><span class="token punctuation">,</span> any<span class="token punctuation">(</span><span class="token operator">!</span>measurements<span class="token operator">$</span>all_ok<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"\n"</span><span class="token punctuation">)</span> cat<span class="token punctuation">(</span><span class="token string">"Number of good parts:"</span><span class="token punctuation">,</span> sum<span class="token punctuation">(</span>measurements<span class="token operator">$</span>all_ok<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"\n"</span><span class="token punctuation">)</span> cat<span class="token punctuation">(</span><span class="token string">"Number of bad parts:"</span><span class="token punctuation">,</span> sum<span class="token punctuation">(</span><span class="token operator">!</span>measurements<span class="token operator">$</span>all_ok<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"\n"</span><span class="token punctuation">)</span> |
Part 9: Operator Precedence Table
Understanding the order of operations helps avoid unexpected results:
| Precedence | Operators | Description |
|---|---|---|
| 1 | () |
Parentheses (highest) |
| 2 | ! |
NOT |
| 3 | &, && |
AND |
| 4 | |, || |
OR (lowest) |
Examples Showing Precedence
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<span class="token comment"># Without parentheses</span> result <span class="token operator"><-</span> <span class="token operator">!</span><span class="token boolean">TRUE</span> <span class="token operator">&</span> <span class="token boolean">FALSE</span> <span class="token operator">|</span> <span class="token boolean">TRUE</span> <span class="token comment"># Step 1: !TRUE = FALSE</span> <span class="token comment"># Step 2: FALSE & FALSE = FALSE</span> <span class="token comment"># Step 3: FALSE | TRUE = TRUE</span> <span class="token comment"># With parentheses - same result but clearer</span> result <span class="token operator"><-</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token boolean">TRUE</span><span class="token punctuation">)</span> <span class="token operator">&</span> <span class="token boolean">FALSE</span><span class="token punctuation">)</span> <span class="token operator">|</span> <span class="token boolean">TRUE</span> <span class="token comment"># Changing logic with parentheses</span> x <span class="token operator"><-</span> <span class="token boolean">TRUE</span> y <span class="token operator"><-</span> <span class="token boolean">FALSE</span> z <span class="token operator"><-</span> <span class="token boolean">TRUE</span> <span class="token comment"># Different grouping changes meaning</span> result_a <span class="token operator"><-</span> x <span class="token operator">&</span> <span class="token punctuation">(</span>y <span class="token operator">|</span> z<span class="token punctuation">)</span> <span class="token comment"># TRUE & (FALSE | TRUE) = TRUE & TRUE = TRUE</span> result_b <span class="token operator"><-</span> <span class="token punctuation">(</span>x <span class="token operator">&</span> y<span class="token punctuation">)</span> <span class="token operator">|</span> z <span class="token comment"># (TRUE & FALSE) | TRUE = FALSE | TRUE = TRUE</span> <span class="token comment"># Both give TRUE here, but the logic path is different</span> |
Part 10: Common Pitfalls and Solutions
Pitfall 1: Using & Instead of && in if Statements
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
x <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">)</span> <span class="token comment"># ❌ This gives a warning and only uses first element</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">&</span> <span class="token boolean">TRUE</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"This will run but with a warning"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># ✅ Use any() or all() with vector conditions</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>any<span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"At least one TRUE"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># ✅ Or use && for single values</span> single_x <span class="token operator"><-</span> x<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>single_x <span class="token operator">&&</span> <span class="token boolean">TRUE</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"This is fine"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Pitfall 2: Forgetting Parentheses in Complex Conditions
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment"># ❌ Without parentheses, order of operations can surprise you</span> age <span class="token operator"><-</span> <span class="token number">25</span> income <span class="token operator"><-</span> <span class="token number">30000</span> credit <span class="token operator"><-</span> <span class="token number">700</span> <span class="token comment"># You might intend: (age >= 21) OR (income > 25000 AND credit > 650)</span> <span class="token comment"># But this is interpreted as: (age >= 21 OR income > 25000) AND credit > 650</span> eligible <span class="token operator"><-</span> age <span class="token operator">>=</span> <span class="token number">21</span> <span class="token operator">|</span> income <span class="token operator">></span> <span class="token number">25000</span> <span class="token operator">&</span> credit <span class="token operator">></span> <span class="token number">650</span> <span class="token comment"># ✅ Always use parentheses for clarity</span> eligible <span class="token operator"><-</span> <span class="token punctuation">(</span>age <span class="token operator">>=</span> <span class="token number">21</span><span class="token punctuation">)</span> <span class="token operator">|</span> <span class="token punctuation">(</span>income <span class="token operator">></span> <span class="token number">25000</span> <span class="token operator">&</span> credit <span class="token operator">></span> <span class="token number">650</span><span class="token punctuation">)</span> |
Pitfall 3: Mixing Logical and Bitwise Operations
R doesn’t have separate bitwise operators like some languages – & and | are always logical when used with logical vectors.
Pitfall 4: NA Values in Logical Operations
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="token comment"># NA values propagate in logical operations</span> x <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token keyword">NA</span><span class="token punctuation">)</span> y <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token boolean">FALSE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span><span class="token punctuation">)</span> x <span class="token operator">&</span> y <span class="token comment"># Returns: FALSE, FALSE, NA</span> x <span class="token operator">|</span> y <span class="token comment"># Returns: TRUE, TRUE, TRUE</span> <span class="token comment"># Handle NA explicitly if needed</span> result <span class="token operator"><-</span> ifelse<span class="token punctuation">(</span>is.na<span class="token punctuation">(</span>x<span class="token punctuation">)</span> <span class="token operator">|</span> is.na<span class="token punctuation">(</span>y<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token boolean">FALSE</span><span class="token punctuation">,</span> x <span class="token operator">&</span> y<span class="token punctuation">)</span> print<span class="token punctuation">(</span>result<span class="token punctuation">)</span> |
Summary: The Logical Operators Philosophy
Logical operators are the glue that binds conditions together. Master these patterns:
-
Element-wise (
&,|) – For vectors and data frame columns -
Short-circuit (
&&,||) – For control flow and single conditions -
NOT (
!) – For negation -
any()andall()– For summarizing logical vectors
Key takeaways:
-
Use
&and|with vectors to create new logical columns -
Use
&&and||inif,while, andforstatements -
Always use parentheses in complex conditions
-
Remember that
NAvalues can cause unexpected results -
Combine with
any()andall()for summary checks
When to use each:
-
Data transformation:
&and|with vectors -
Control flow:
&&and||inifstatements -
Negation:
!anywhere you need to flip TRUE/FALSE -
Summaries:
any()andall()on logical vectors
The art of using logical operators is about expressing complex conditions clearly and correctly. Start simple, test your conditions, and always prioritize readability over cleverness.
Would you like me to elaborate on any specific aspect of logical operators or explore more complex real-world examples?
