R Objects Demonstration

Scalar

A scalar in R is a single value, such as a number or a string.

# Numeric scalar
num_scalar <- 42

# Character scalar
char_scalar <- "Hello, world!"

num_scalar
[1] 42
char_scalar
[1] "Hello, world!"

Vector

Vectors store a collection of elements of the same type.

# Numeric vector
num_vec <- c(1, 2, 3, 4)

# Character vector
char_vec <- c("A", "B", "C")

num_vec
[1] 1 2 3 4
char_vec
[1] "A" "B" "C"

List

Lists can store elements of different types.

my_list <- list(name = "Alice", age = 30, scores = c(85, 90, 88))
my_list
$name
[1] "Alice"

$age
[1] 30

$scores
[1] 85 90 88

Matrix

A matrix is a two-dimensional structure where all elements are of the same type.

mat <- matrix(1:6, nrow = 2, ncol = 3)
mat
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

Array

An array can have more than two dimensions.

arr <- array(1:12, dim = c(3, 2, 2))
arr
, , 1

     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

, , 2

     [,1] [,2]
[1,]    7   10
[2,]    8   11
[3,]    9   12

Data Frame

A data frame is a table-like structure where columns can have different types.

df <- data.frame(Name = c("Alice", "Bob"), Age = c(25, 30))
df

Factor

Factors handle categorical data.

gender <- factor(c("Male", "Female", "Female"))
gender
[1] Male   Female Female
Levels: Female Male

Function

Functions are objects that perform specific tasks.

add <- function(a, b) {
  return(a + b)
}

add(5, 7)
[1] 12

Checking Object Types

You can inspect the type or structure of an object using built-in functions.

class(num_vec)  # Class of the vector
[1] "numeric"
str(my_list)    # Structure of the list
List of 3
 $ name  : chr "Alice"
 $ age   : num 30
 $ scores: num [1:3] 85 90 88
typeof(mat)     # Type of the matrix
[1] "integer"
email_data %>% group_by(EmailID) %>% summarise(email_count = n()) %>%
summarise(email_count > 1)
G1;H1;Errorh in email_data %>% group_by(EmailID) %>% summarise(email_count = n()) %>%  : 
  could not find function "%>%"
Error during wrapup: not that many frames on the stack
Error: no more error handlers available (recursive errors?); invoking 'abort' restart
g
if (!require("tidyverse")) install.packages("tidyverse")
G3;Loading required package: tidyverse
g── Attaching core tidyverse packages ────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.2     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.0.4     
── Conflicts ──────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(tidyverse)
load("HW1_Retail_Transactions_Data.RData")
head(retail_transaction_records)
head(retail_transaction_details)
# Method 1: Using dplyr's left_join
retail_data <- left_join(retail_transaction_records, retail_transaction_details, by = "TransactionID")

# Method 2: Using base R's merge function
retail_data2 <- merge(retail_transaction_records, retail_transaction_details, by = "TransactionID")
mean(retail_data$Price)
[1] 16.75
retail_data <- retail_data %>%
  mutate(Revenue = Price * Quantity)
retail_data <- retail_data %>%
  mutate(ProductCategory = ifelse(ProductID %in% c("P0", "P1", "P2"), "CategoryA", "CategoryB"))
units_per_category <- retail_data %>%
  group_by(ProductCategory) %>%
  summarise(TotalUnits = sum(Quantity))
units_per_category
top_product <- retail_data %>%
  group_by(ProductID) %>%
  summarise(TotalRevenue = sum(Revenue)) %>%
  arrange(desc(TotalRevenue)) %>%
  slice(1)
top_product
transactions_per_payment <- retail_data %>%
  group_by(PaymentMethod) %>%
  summarise(NumTransactions = n())
transactions_per_payment
discount_proportion <- retail_data %>%
  group_by(ProductID, Channel) %>%
  summarise(ProportionDiscounted = mean(DiscountApplied))
`summarise()` has grouped output by 'ProductID'. You can override using the `.groups`
argument.
discount_proportion
most_recent_date <- max(retail_data$TransactionDate)
most_recent_date
[1] "2024-04-09 UTC"
discounted_cash_purchases <- retail_data %>%
  filter(DiscountApplied == 1, PaymentMethod == "Cash") %>%
  nrow()
discounted_cash_purchases
[1] 4
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBSIE9iamVjdHMgRGVtb25zdHJhdGlvbgoKIyMgU2NhbGFyCkEgc2NhbGFyIGluIFIgaXMgYSBzaW5nbGUgdmFsdWUsIHN1Y2ggYXMgYSBudW1iZXIgb3IgYSBzdHJpbmcuCmBgYHtyIHNjYWxhcn0KIyBOdW1lcmljIHNjYWxhcgpudW1fc2NhbGFyIDwtIDQyCgojIENoYXJhY3RlciBzY2FsYXIKY2hhcl9zY2FsYXIgPC0gIkhlbGxvLCB3b3JsZCEiCgpudW1fc2NhbGFyCmNoYXJfc2NhbGFyCmBgYAoKIyMgVmVjdG9yClZlY3RvcnMgc3RvcmUgYSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUuCmBgYHtyIHZlY3Rvcn0KIyBOdW1lcmljIHZlY3RvcgpudW1fdmVjIDwtIGMoMSwgMiwgMywgNCkKCiMgQ2hhcmFjdGVyIHZlY3RvcgpjaGFyX3ZlYyA8LSBjKCJBIiwgIkIiLCAiQyIpCgpudW1fdmVjCmNoYXJfdmVjCmBgYAoKIyMgTGlzdApMaXN0cyBjYW4gc3RvcmUgZWxlbWVudHMgb2YgZGlmZmVyZW50IHR5cGVzLgpgYGB7ciBsaXN0fQpteV9saXN0IDwtIGxpc3QobmFtZSA9ICJBbGljZSIsIGFnZSA9IDMwLCBzY29yZXMgPSBjKDg1LCA5MCwgODgpKQpteV9saXN0CmBgYAoKIyMgTWF0cml4CkEgbWF0cml4IGlzIGEgdHdvLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSB3aGVyZSBhbGwgZWxlbWVudHMgYXJlIG9mIHRoZSBzYW1lIHR5cGUuCmBgYHtyIG1hdHJpeH0KbWF0IDwtIG1hdHJpeCgxOjYsIG5yb3cgPSAyLCBuY29sID0gMykKbWF0CmBgYAoKIyMgQXJyYXkKQW4gYXJyYXkgY2FuIGhhdmUgbW9yZSB0aGFuIHR3byBkaW1lbnNpb25zLgpgYGB7ciBhcnJheX0KYXJyIDwtIGFycmF5KDE6MTIsIGRpbSA9IGMoMywgMiwgMikpCmFycgpgYGAKCiMjIERhdGEgRnJhbWUKQSBkYXRhIGZyYW1lIGlzIGEgdGFibGUtbGlrZSBzdHJ1Y3R1cmUgd2hlcmUgY29sdW1ucyBjYW4gaGF2ZSBkaWZmZXJlbnQgdHlwZXMuCmBgYHtyIGRhdGFmcmFtZX0KZGYgPC0gZGF0YS5mcmFtZShOYW1lID0gYygiQWxpY2UiLCAiQm9iIiksIEFnZSA9IGMoMjUsIDMwKSkKZGYKYGBgCgojIyBGYWN0b3IKRmFjdG9ycyBoYW5kbGUgY2F0ZWdvcmljYWwgZGF0YS4KYGBge3IgZmFjdG9yfQpnZW5kZXIgPC0gZmFjdG9yKGMoIk1hbGUiLCAiRmVtYWxlIiwgIkZlbWFsZSIpKQpnZW5kZXIKYGBgCgojIyBGdW5jdGlvbgpGdW5jdGlvbnMgYXJlIG9iamVjdHMgdGhhdCBwZXJmb3JtIHNwZWNpZmljIHRhc2tzLgpgYGB7ciBmdW5jdGlvbn0KYWRkIDwtIGZ1bmN0aW9uKGEsIGIpIHsKICByZXR1cm4oYSArIGIpCn0KCmFkZCg1LCA3KQpgYGAKCiMjIENoZWNraW5nIE9iamVjdCBUeXBlcwpZb3UgY2FuIGluc3BlY3QgdGhlIHR5cGUgb3Igc3RydWN0dXJlIG9mIGFuIG9iamVjdCB1c2luZyBidWlsdC1pbiBmdW5jdGlvbnMuCmBgYHtyIGNoZWNrLXR5cGVzfQpjbGFzcyhudW1fdmVjKSAgIyBDbGFzcyBvZiB0aGUgdmVjdG9yCnN0cihteV9saXN0KSAgICAjIFN0cnVjdHVyZSBvZiB0aGUgbGlzdAp0eXBlb2YobWF0KSAgICAgIyBUeXBlIG9mIHRoZSBtYXRyaXgKYGBgCgpgYGB7cn0KZW1haWxfZGF0YSAlPiUgZ3JvdXBfYnkoRW1haWxJRCkgJT4lIHN1bW1hcmlzZShlbWFpbF9jb3VudCA9IG4oKSkgJT4lCnN1bW1hcmlzZShlbWFpbF9jb3VudCA+IDEpCgpgYGAKYGBge3J9CmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpCmBgYApgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmBgYApgYGB7cn0KbG9hZCgiSFcxX1JldGFpbF9UcmFuc2FjdGlvbnNfRGF0YS5SRGF0YSIpCmBgYApgYGB7cn0KaGVhZChyZXRhaWxfdHJhbnNhY3Rpb25fcmVjb3JkcykKaGVhZChyZXRhaWxfdHJhbnNhY3Rpb25fZGV0YWlscykKYGBgCmBgYHtyfQojIE1ldGhvZCAxOiBVc2luZyBkcGx5cidzIGxlZnRfam9pbgpyZXRhaWxfZGF0YSA8LSBsZWZ0X2pvaW4ocmV0YWlsX3RyYW5zYWN0aW9uX3JlY29yZHMsIHJldGFpbF90cmFuc2FjdGlvbl9kZXRhaWxzLCBieSA9ICJUcmFuc2FjdGlvbklEIikKCiMgTWV0aG9kIDI6IFVzaW5nIGJhc2UgUidzIG1lcmdlIGZ1bmN0aW9uCnJldGFpbF9kYXRhMiA8LSBtZXJnZShyZXRhaWxfdHJhbnNhY3Rpb25fcmVjb3JkcywgcmV0YWlsX3RyYW5zYWN0aW9uX2RldGFpbHMsIGJ5ID0gIlRyYW5zYWN0aW9uSUQiKQpgYGAKYGBge3J9Cm1lYW4ocmV0YWlsX2RhdGEkUHJpY2UpCmBgYApgYGB7cn0KcmV0YWlsX2RhdGEgPC0gcmV0YWlsX2RhdGEgJT4lCiAgbXV0YXRlKFJldmVudWUgPSBQcmljZSAqIFF1YW50aXR5KQpgYGAKYGBge3J9CnJldGFpbF9kYXRhIDwtIHJldGFpbF9kYXRhICU+JQogIG11dGF0ZShQcm9kdWN0Q2F0ZWdvcnkgPSBpZmVsc2UoUHJvZHVjdElEICVpbiUgYygiUDAiLCAiUDEiLCAiUDIiKSwgIkNhdGVnb3J5QSIsICJDYXRlZ29yeUIiKSkKYGBgCmBgYHtyfQp1bml0c19wZXJfY2F0ZWdvcnkgPC0gcmV0YWlsX2RhdGEgJT4lCiAgZ3JvdXBfYnkoUHJvZHVjdENhdGVnb3J5KSAlPiUKICBzdW1tYXJpc2UoVG90YWxVbml0cyA9IHN1bShRdWFudGl0eSkpCnVuaXRzX3Blcl9jYXRlZ29yeQpgYGAKYGBge3J9CnRvcF9wcm9kdWN0IDwtIHJldGFpbF9kYXRhICU+JQogIGdyb3VwX2J5KFByb2R1Y3RJRCkgJT4lCiAgc3VtbWFyaXNlKFRvdGFsUmV2ZW51ZSA9IHN1bShSZXZlbnVlKSkgJT4lCiAgYXJyYW5nZShkZXNjKFRvdGFsUmV2ZW51ZSkpICU+JQogIHNsaWNlKDEpCnRvcF9wcm9kdWN0CmBgYApgYGB7cn0KdHJhbnNhY3Rpb25zX3Blcl9wYXltZW50IDwtIHJldGFpbF9kYXRhICU+JQogIGdyb3VwX2J5KFBheW1lbnRNZXRob2QpICU+JQogIHN1bW1hcmlzZShOdW1UcmFuc2FjdGlvbnMgPSBuKCkpCnRyYW5zYWN0aW9uc19wZXJfcGF5bWVudApgYGAKYGBge3J9CmRpc2NvdW50X3Byb3BvcnRpb24gPC0gcmV0YWlsX2RhdGEgJT4lCiAgZ3JvdXBfYnkoUHJvZHVjdElELCBDaGFubmVsKSAlPiUKICBzdW1tYXJpc2UoUHJvcG9ydGlvbkRpc2NvdW50ZWQgPSBtZWFuKERpc2NvdW50QXBwbGllZCkpCmRpc2NvdW50X3Byb3BvcnRpb24KYGBgCmBgYHtyfQptb3N0X3JlY2VudF9kYXRlIDwtIG1heChyZXRhaWxfZGF0YSRUcmFuc2FjdGlvbkRhdGUpCm1vc3RfcmVjZW50X2RhdGUKYGBgCmBgYHtyfQpkaXNjb3VudGVkX2Nhc2hfcHVyY2hhc2VzIDwtIHJldGFpbF9kYXRhICU+JQogIGZpbHRlcihEaXNjb3VudEFwcGxpZWQgPT0gMSwgUGF5bWVudE1ldGhvZCA9PSAiQ2FzaCIpICU+JQogIG5yb3coKQpkaXNjb3VudGVkX2Nhc2hfcHVyY2hhc2VzCmBgYAoK