0% found this document useful (0 votes)
71 views

Basic R Programming

1. This document covers various R programming concepts including data types, vectors, matrices, data frames, lists, flow control, and functions. 2. Key concepts discussed include creating and manipulating vectors, matrices, and data frames; performing arithmetic operations; subsetting and indexing data structures; and using control flow statements like if/else and for loops. 3. Built-in functions are demonstrated like grep(), grepl(), and print() as well as creating custom functions to perform tasks like calculating squares of numbers in a vector.

Uploaded by

SDM
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
71 views

Basic R Programming

1. This document covers various R programming concepts including data types, vectors, matrices, data frames, lists, flow control, and functions. 2. Key concepts discussed include creating and manipulating vectors, matrices, and data frames; performing arithmetic operations; subsetting and indexing data structures; and using control flow statements like if/else and for loops. 3. Built-in functions are demonstrated like grep(), grepl(), and print() as well as creating custom functions to perform tasks like calculating squares of numbers in a vector.

Uploaded by

SDM
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 37

1.

Variables and data types


model1 <- 'hello'
typeof(model1) #character
class(model1) #character
model1
hello_string <- 'hello'
hello_string

x <- 100
typeof(x) #double
y <- 100L
typeof(y) #integer
a = TRUE
typeof(a) #logical

num <- 3.7


typeof(num) #double
class(num) #numeric
2. Arithmetic and Logical Operator
100/2
100*2
100%%2

#output true / false


10>20 & 10<20
10>20 | 10<20
!(10==3)

x<-100
y<-200
x==y
y>x

auction.data <- read.csv("")


auction.data
head(auction.data) #see top 5 values
auction <- read.csv("")
view(auction) #see in table form
x<-auction[auction$bidder=='chiuk' & auction$bid==100,]
x<-auction[auction$bidder=='chiuk' | auction$bid==100,]

#Assigning variables
selling <- 500
cost <-250
profit <- selling - cost
profit
3. Print Formatting
x <- 10
print(x)

print(paste('hello','world')) #hello world


print(paste('hello','world',sep='-')) #hello-world

#paste0 to avoid any space


paste0('hello','world') #helloworld
paste0('Welcome','to','R')

x <- 10:30
x
class(x) #integer
4. Vectors
- a sequence of data elements with same basic types
v1 <- c(1,2,3,4,5)
print(v1)
class(v1) #numeric
typeof(v1) #double

x <- c(TRUE,FALSE) #logical


x <- 9:29 #integer
x <- c(1+0i, 2+4i) #complex

x<- vector("numeric",length = 10)

#create a vector of numbers


numbers = c(1,2,3,4,5,6)
numbers
print(numbers)

#create a vector of letters


ltrs = c('a','b','c','d')
print(ltrs)

#concatenating the both above


mixed_vec = c(numbers,ltrs)
print(mixed_vec)
class(mixed_vec) #character

#integer vector
num = 1:10
#numeric vector
num = c(1:10,10.5)
num
#character vector
ltrs = letters[1:10]
ltrs

#factor vector
fac = as.factor(ltrs)
class(fac)
5. List
- a generic vector that can contain object of different types
list <- list(x=c(10,20,30),
y=c("a","b","c"),
z=c(TRUE,FALSE))
list

test <- list("music tracks",100,5)


test
is.list(test) #TRUE

names(test) <- c("product","count","rating")


test
#$product
#music tracks

test[[1]]

product.category <- list(product="music tracks",count=100,ratings=5)


product.category

str(product.category) #more compact display

similar.prod <- list(product="films",count=50,ratings=4)


product.category <- list(product="music tracks",count=100,ratings=5,similar=similar.prod)
product.category

product.category[["product"]]
product.category$product
6. Matrix
matrix(1:6,nrow=2) # 1 2 3
#246
matrix(1:6,ncol=2) # 1 4
#25
#36
matrix(1:6,nrow=2,byrow=TRUE) # 1 2 3
#456
matrix(1:3,nrow=2,ncol=3) # 1 3 2
#213
cbind(1:3,1:3) # 1 1
#22
#33
rbind(1:3,1:3) # 1 2 3
#123
n<-matrix(1:6,byrow=TRUE,nrow=2) # 1 2 3
n #456
rbind(n,7:9) # 1 2 3
n #456
#789
cbind(n,c(10,11))
n <- matrix(1:6,byrow=TRUE,nrow=2)
rownames(n) <- c("row1","row2")
n
colnames(n) <- c("col1","col2","col3")
n
x <- matrix(1:8,ncol=2)
l <- matrix(LETTERS[1:6],nrow=4,ncol=3)
l
cbind(x,l)
7. Data frame
- used to store data in the form of table
name <- c("John","Peter","Patrick","Julie","Bob")
age <- c(28,30,31,38,35)
children <- c(FALSE,TRUE,TRUE,FALSE,TRUE)
df <- data.frame(name,age,children)
df <- data.frame(Name=name,Age=age,Children=children)
df
df[3,2] #31
df[3,"age"]
df[3,]
df[["age"]]
df[c(3,5),c("Age","Children")]
df[2]

Modify data
height <- c(163,177,163,162,157)
df$height <- height
df

weight <- c(75,65,54,34,78)


cbind(df,weight)
tom <- data.frame("Tom",36,FALSE,183,89)
rbind(df,tom)

Sorting (Ascending)
sort(df$age)
ranks <- order(df$age)
df[ranks,]
Sorting (Descending)
df[order(df$age,descending = TRUE),]

Vectors
#create vectors
vec1 <- c(10,20,30)
vec2 <- c("a","b","c")
vec3 <- c(TRUE,FALSE,TRUE)

vec1;vec2;vec3

vec4 <- c(10,"a",TRUE) #character


vec5 <- c(FALSE,2) #numeric
vec6 <- c('A',1) #character
vec7 <- c(1:20)
vec8 <- seq(1,20)
vec9 <- 1:25

#create a vector with odd values 1 to 20


odd_value <- seq(1,20,2)
odd_value

#create vector with even values


even_value <- seq(2,20,2)
even_value

#create vector with 10 odd values starting from 20


vec10 <- seq(from=21,by=2,length.out=10)
vec10
#naming vectors using names() function
temperature <- c(72,71,68,73,70,75,71)
temperature
names(temperature) <- c('Mon','Tue','Wed','Thu','Fri','Sat','Sun')
temperature

#another way to name your vectors


days <- c('Mon','Tue','Wed','Thu','Fri','Sat','Sun')
temperature1 <- c(72,71,68,73,70,75,71)
names(temperature1) <- days
temperature1

#give name to each price values


price <- seq(100,220,20)
names(price) <- paste0("p",1:7)
price
p1 p2 p3 p4 p5 p6 p7
100 120 140 160 180 200 220

#basic operation on vectors


v1 <- c(2,1,4)
sum(v1)
sd(v1)
var(v1)
prod(v1)
max(v1)
min(v1)

#vector licing and indexing


price1 <- seq(550,670,20)
names(price1) <- paste0("p",1:7)
price1
#using index position
price1[3]
price1[3:4]
price1[c(1,4)]
#using names
price1["p3"]
price1[c("p3","p4")]
#using logical position
price1[c(T,F,T,T,F,F,F)]
price1[c(T,F)]
#using exclude position method
price1[-2]
price1[c(-2,-5)]
#using comparison operator
price1[price1>600]

#handling NA values in vectors


order_detail <- c(10,20,30,NA,50,60)
names(order_detail) <- c("Mon","Tue","Wed","Thu","Fri","Sat")
order_detail + 5

#to add two vectors


new_order <- c(5,10)
update_order <- order_detail + new_order

#create subset of vector


firsttwo <- order_detail[1:2]
firsttwo
l <- length(order_detail)

v1 <- order_detail[(l-1):1]
v3 <- order_detail[l:1]

#to omit NA value from the vector


na.omit(order_detail[order_detail<30])

#find order details that are multiple of 3


(order_detail %% 3) == 3
order_detail[(order_detail %% 3)==0]
na.omit(order_detail[(order_detail %% 3)==0])

#remove NA values
sum(order_detail,na.rm=T)
Matrix
mat1 <- matrix(0,3,3) #3 columns 3 rows
mat1
mat2 <- matrix(1:9,3,3)
mat2
mat3 <- matrix(1:9,nrow=3,byrow=T)
mat3

#create matrix from vectors


stock1 <- c(450,451,452,445,468)
stock2 <- c(230,231,232,236,228)
stocks <- c(stock1,stock2)
stocks
stock.matrix <- matrix(stocks,byrow=TRUE,nrow=2)
stock.matrix

#naming a matrix
days <- c('Mon','Tue','Wed','Thu','Fri')
st.names <- c('Stock1','Stock2')
colnames(stock.matrix) <- days
rownames(stock.matrix) <- st.names
stock.matrix

#functions associated with matrix


nrow(mat3) #no. of rows
ncol(mat3) #no. of columns
dim(mat3) #no. of rows and columns
rownames(stock.matrix)
colnames(stock.matrix)
colSums(stock.matrix)
rowSums(stock.matrix)
rowMeans(stock.matrix)

# add rows and colums to a matrix


stock3 <- c(150,151,149,120,114)
total_stock <- rbind(stock.matrix,stock3)
total_stock

avg <- rowMeans(total_stock)


total_stock <- cbind(total_stock,avg)
total_stock

#matrix selection and indexing


student <-
matrix(c(20,30,NA,70,22,28,36,80,24,26,32,75,26,24,NA,50),nrow=4,ncol=4,byrow=T)
dimnames(student) <-
list(c("John","Mathew","Sam","Alice"),c("Phy","Chem","Bio","Maths"))
student

#extraction of colums
student[,1:2]
student[,c(1,3)]

student["John",2:3]
student[c("John","Sam"),4]

#find average score of John


mean(student[c("John"),],na.rm=T)

#find average and total score of all students


apply(student,1,mean,na.rm=T)
apply(student,1,sum,na.rm=T)

passing_score <- c(25,25,25,70)


passing_score

#how many subject Alice has passed


pass <- (student[c("Alice"),]>passing_score)
pass
sum(pass,na.rm=T)
Data frames
data()
data(AirPassengers)
head(AirPassengers)
head(iris)
view(iris)
view(state.x77)
view(USPersonalExpenditure)
tail(USPersonalExpenditure)

summary(iris)
str(iris)

#filtering data frame


subset(df,subset=rain==TRUE)
subset(df,subset=temp>25)

#sorting data frame


sorted.temp <- order(df['temp'])
df[sorted.temp,]
sorted.temp

desc.temp <- order(-df['temp'])


df[desc.temp,]

#another method to sort


sort.temp <- order(df$temp)
df[sort.temp,]
#merging data frames
(m1 <- merge(authors,books,by.x="surname",by.y="name"))

#manipulate data frame


salesreport <- data.frame(Id=101:110,
Product=c("A","B"),
Unitprice=as.integer(runif(10,100,200)),
Qty=as.integer(runif(10,20,30)))
salesreport

#transpose data frame


transpose.salesreport <- t(salesreport)
view(transpose.salesreport)
head(transpose.salesreport)

#sorting data frame


salesreport[order(salesreport$Unitprice),]
salesreport[order(salesreport$Unitprice,decreasing=T),]

#subnetting data frame


subset.ProductA <- subset(salesreport,Product=="A")
subset.ProductA
subset.salesreport <- subset(salesreport,Product=="A" & Unitprice>150,c(1,4))

#merging data frame


setA <- subset(salesreport,Product=="A")
setB <- subset(salesreport,Product=="B")
cbind(setA,setB)
rbind(setA,setB)
#aggregate function
aggregate(salesreport$Qty,list(salesreport$Prod),sum,na.rm=T)

List
list2 <- list(vec=seq(1:10),
mat=matrix(1:9,3,3),
lis=list(a=10,b=20))
list2
is.recursive(list2)

#indexing of list
list2[2]
list2$mat
list2['vec']
list2[[3]][2] #3rd element second value
list2$lis[2]

#conversion of vectors to list


price <- c(10,20,30)
pricelist <- as.list(price)
newPrice <- unlist(pricelist)

#convert vectors to matrix


price1 <- c(10,20,30,40)
dim(price1) <- c(2,2)

toupper(c1) #uppercase
substr(c1,1,2) #extract set of characters
newname <- sub("Rob","Cena",name) #replace
8. Flow Control
#if-else
x <- 30L
if(is.integer(x)){
print("x is an integer")
}else{
print("x is not an integer")
}

#while loop
v <- c("Hello World")
count <- 2
while (count<7){
print(v)
count=count+1
}

#for loop
fruit <- c('Apple','Orange','Banana')
for (i in fruit){
print(i)
}
for (i in 1:length(fruit)){
print(fruit[i])
}
#print square and square roots
for(i in 1:25){
sq=i*i
sqroot=sqrt(i)
message("i=",i,"sq=",sq,"sqroot=",sqroot) }
9. Functions
Build-in function
text <- "R is fun to learn"
grepl('fun',text)

v <- c('a','b','c','d')
grep('b',v)

Function
squares <- function(a) {
for(i in 1:a){
b <- i^2
print(b)
}
}
squares(4)

#simple function
hello_world <- function(){
print("Hello world in R")
}
hello_world()

hello_name <- function(name){


print(paste('Hello',name))
}
hello_name('John')

add_num <- function(num1,num2){


print(num1+num2)
}
add_num(30,40)

#add a vector to a number


add_num(c(10,20,30),5)

#function with default argument values


hello_name <- function(name='Rick'){
print(paste('Hello',name))
}
hello_name()
hello_name('Sam')

#return value from a function


full_name <- function(name='Sachin',title='Tendulkar'){
return(paste(name,'',title))
}
full_name()
full_name2 <- full_name('Don','Bradman')
full_name2
full_name(title="john",name='Smith')

#10 generate 1000 radom values from a normal distribution of mean 0 and 1000
normalDist <- rnorm(100,0,1)
mean(normalDist)
hist(normalDist)

#to get histogram with large number of interval breaks


hist(normalDist,breaks=50)
#function with optional arguments
expoValue <- function(x,power=2){
hist(x^power)
}
expoValue(normalDist)

#or
expoValue(normalDist,power=4)

#pass other argument


expoValue <- function(x,power=2,...){
hist(x^power,...)
}

expoValue(normalDist,power=2,breaks=50)

#passing logical arguments


expoValue <- function(x,exp=2,hist=FALSE,...){
if(hist==TRUE){
hist(x^exp)
}else{
x^exp
}
}
expoValue(normalDist)
expoValue(normalDist,hist=TRUE)
#example function1
status <- function(marks){
result="Not Defined"
if(marks>50) result="PASS"
message("Your result is ",result)
}
status(60)
status(30)

#example2
status <- function(age){
ageGrp = "Not Defined"
vote = "Not Defined"
if(age>=18){
ageGrp='Adult'
vote = "Yes"
}
message("Your age group is ",ageGrp)
message("Voting status is ",vote)
}
status(20)

#example to convert a name into uppercase


status <- function(name){
len <- nchar(name)
if(len>5) name=toupper(name)
message("User given name is ",name)
}
status("Johnny")
#example to calculate bonus
get_bonus <- function(salary,exp){
if(exp>5){
bonus_per=10
}else{
bonus_per=5
}
bonus=salary*(bonus_per/100)
return(bonus)
}
get_bonus(25000,5)

#function example
sqr <- function(n)
{
repeat{
square=n*n
message("The square is ",square)
if(square>=100) break
n=n+1
}
return(n)
}
sqr(6)
Switch case
HRA <- function(city){
hra_amt <- switch(toupper(city),
BLR=7500,
MUM=1000,
CHN=7500,
5000
)
return(hra_amt)
}
HRA("VOK")

salary_range <- function(band){


range <- switch(band,
L1 = "10000 - 15000",
L2 = "15000-25000",
L3 = "25000-40000")
return(range)
}
salary_range("L1")
salary_range("B1")

Repeat
time <- 15
repeat{
message("Hello,welcome to R")
if(time>=20) break
time=time+1
}
Build in function
#build in function
seq(1,10,by=2)

v <- c(11,4,5,7,3,10,2)
sort(v)
sort(v, decreasing = TRUE)

v2 <- c(1,2,3,4,5)
rev(v2)

append(v,v2)

Factor
dresssize <- c("M","L","S","S","L","M","L","M")
dresssize_factor <- factor(dresssize,ordered=TRUE,levels=c("S","M","L"))
dresssize_factor

dresssize_factor[1] < dresssize_factor[2]

Type.factor <- factor(Type,ordered=T,level=c("S","M","L").


labels=c("Small","Medium","Large"))
Date
Sys.Date
as.Date('1990-11-03')
as.Date("Nov-03-90",format="%b-%d-%y")
#%b = full month name, %y = year in 4 digits
8. Data manipulation
- dplyr package is used to transform and summarize tabular data with rows and columns

install.packages("dplyr")
library(dplyr)
install.packages('nycflights13')
library('nycflights13')

view(flights)
head(flights)

#filter()
f1 <- filter(flights,month==07)
view(f1)

f2 <- filter (flights,month==07,day==3)


f2
view(f2)

view(filter(flights,month==09,day==2,origin=='LGA'))

#OR -more specific


head(flights[flights$month==09 & flights$day==2 & flights$origin=='LGA',])

#slice()
slice(flights,1:5)
slice(flights,5:10)

#mutate() to add new column


over_delay <- mutate(flights,overall_delay=arr_delay-dep_delay)
view(over_delay)

#transmute() used to show only new column


over_delay <- transmute(flights,overall_delay=arr_delay-dep_delay)

#summarise() used to find descriptive statistics


summarise(flights,avg_air_time=mean(air_time,na.rm=T))

#group by()
head(mtcars)
by_gear <- mtcars %>% group_by(gear)
by_gear

a<- summarise(by_gear,gear1=sum(gear),gear2=mean(gear))
a

summarise(group_by(mtcars,cy1),mean(gear,na.rm=TRUE))
b <- by_gear %>% summarise(gear1=sum(gear),gear2=mean(gear))
b
view(by_gear)

#example2
by_cy1 <- mtcars %>% group_by(cy1)
by_cy1 %>% summarise(
gear = mean(gear)
hp = mean(hp)
)
head(by_cy1)

#sample()
sample_n(flight,15) #15 random samples
sample_frac(flights,0.4) #return 40% of the total data

#arrange() to sort dataset


view(arrange(flights,yesr,dep_time))
head(arrange(flights,yesr,dep_time))

#usage of pipe operator %>%


df <- mtcars
df
view(mtcars)

result <- arrange(sample_n(filter(df,mpg>20),size=5),desc(mpg))


view(result)

#multiple assignment
a <- filter(df,mpg=20)
b <- sample_n(a,size=5)
result <- arrange(b,desc(mpg))
result

#using pipe operator


result <- df %>% filter(mpg>20) %>% sample_n(size=10) %>% arrange(desc(mpg))
result

#selected columns
#ot same as filter, filter only specific data
df
df_mpg_hp_cy1 = df %>% select(mpg,hp,cy1)
head(df_mpg_hp_cy1)
- tidyr package helps to create tidy data.
install.packages('tidyr')
library('tidyr')

n=10

wide <- data.frame(


ID = c(1:n)
Face.1 = c(411,723,325,456,579,612,709,513,527,379),
Face.2 = c(541,568,523,547,985,632,410,568,954,156),
Face.3 = c(547,352,985,785,458,126,844,695,758,945),
)
view(wide)

#gather() to long format


long <- wide %>% gather(Face, ResponseTime, Face.1:Face.3)
view(long)

#seperate() to split single column into multiple columns


long_separate <- long %>% separate(Face, c("Target","Number"))
view(long_separate)

#unite() combines multiple to single column


long_unite <- long_seperate %>% unite(Face, Target,Number,sep='.')
view(long_unite)

#spread()-take two columns (key&value) and spreads into multiple comlumns


#it makes "long" data wider
back_to_wide <- long_unite %>% spread(Face, ResponseTime)
view(back_to_wide)
9. Data visualization
installed.packages("datasets")
plot(ChickWeight)

#base graphics
library(MASS)
plot(UScereal$sugars,UScereal$calories)
title("plot(UScereal$sugars,UScereal$calories)")

x <- UScereal$sugars
y <- UScereal$calories
library(grid)

#grid graphics
pushViewport(plotViewport())
pushViewport(dataViewport(x,y))
grid.rect()
grid.xaxis()
grid.yaxis()
grid.points(x,y)
grid.text("UScereal$calories",x=unit(-3,"lines"),rot=90)
grid.text("UScereal$sugars",y=unit(-3,"lines"),rot=0)
popViewport(2)
- ggplot is a data visualization package to create graphs in R // decomposing complex graphs
into logical subunits

- ggplot uses geoms or geometric objects to form the basis of different types of graphs

 geom_bar for bar plots


 geom_line for line graphs
 geom_points for scatter plots
 geom_boxplot for box plots
 geom_quantile for continuous x
 geom_violin for richer display of distribution
 geom_jitter for small data

#example1
library(ggplot2)
head(mpg,n=10)
str(mpg)
install.packages("tidyverse")
library(tidyverse)
ggplot(mpg) + geo_bar(aes(x=class))

#change graph color


ggplot(mpg)+
geom_bar(aes(x=class,fill=blue))

#stacked bar chart


ggplot(mpg)+
geom_bar(aes(x=class,fill=drv))

#dodged bar
ggplot(mpg) +
geom_bar(aes(x=class,
fill=factory(cy1)),
position=position_dodge(preserve='single'))

#line graph
library(tidyverse)
#filter data we need
Tree_1 <- filter(Orange,Tree==1)
#graph the data
ggplot(tree_1)+
geom_line(aes(x=age,y=circumference))

#pie chart
#create data for the graph
x <- c(33,45,70,110)
labels <- c("Soap","Detergent","Oil","Shampoo")
#plot the chart
pie(x,labels)
pie(x,labels,main="City pie chart",col=rainbow(length(x)))
piepercent <- round(100*x/sum(x),1)
pie(x,labels=piepercent,main="City pie chart",col=rainbow(length(x)))
legend("topright",c("Soap","Shampoo","Oil","Grocery"),cex=0.8,
fill=rainbow(length(x)))

#3D pie chart


install.packages("plotrix")
library(plotrix)
x <- c(33,45,70,110)
lbl <- c("Soap","Detergent","Oil","Shampoo")
#plot the chart
pie3D(x,labels=lbl,explode=0.1,main="Pie Chart of Countries")
#histogram
v <- c(9,13,21,8,36,22,12,41,31,33,19)
hist(v,xlab="weight",col="green",border="red")
hist(v,xlab="weight",col="green",border="red",xlim=x(0,40),ylim=c(0,5),
breaks=5)

data("air quality")
view("air quality")

#scatter plots
plot(airquality$ozone,airquality$wind)
plot(airquality$ozone,airquality$wind,col='red')
plot(airquality$ozone,airquality$wind,type='h',col='blue')
plot(airquality)

#assign labels to the plot


plot(airquality$ozone='Ozone Concentration'ylab='No of Instances',main='Ozone levels in
NY city',col='green')

#histogram
hist(airquality$Solar.R)
hist(airquality$Solar.R,main='Solar Radiation vales in air',xlab='Solar rad.')

Temperature <- airquality$Temp


hist(Temperature)

#histogram with labels


h <- hist(Temperature,ylim=c(0,40))
text(h$mids,h$counts,labels=h$counts,adj=c(0.5,-0.5))

#histogram with non-uniform width


hist(Temperature.
main="Maximum daily temperature at LA Airport",
xlab="Temperature in degreed Fahrenheit".
xlim=c(50,100),
col="chocolate",
border="brown",
break=c(55,60,70,75,80,100))

#boxplot
boxplot(airquality$Solar.R)
#multiple box plots
boxplots(airquality[,0:4],main='Multiple Box plots')

#scatter plots
ggplot(data=mtcars,mapping=aes(x=wt,y=mpg))+geom_point()
#scatter plots by factors
view(mtcars)
ggplot(sata=mtcars,mapping=aes(x=wt,y=mpg,col='red'))+geom_point()
#scatter plots by size
ggplot(data=mtcars,mapping=aes(x=wt,y=mpg,size=qsec))+geom_point
ggplot(data=mtcars,mapping=aes(x=mt,y=mpg,col='red',size=qsec))+geom_point()

#visualization using mpg dataset


ggplot2:mpg
view(ggplot2::mpg)

#bar plots
ggplot(data=ggplot::pmg,aes(class))+geom_bar()
#stacked bar chart
ggplot(data=ggplot2::mpg,aes(class)) + geom_bar(aes(fill=drv))
#using dodge
ggplot(data=ggplot2::mpg,aes(class))+geom_bar(aes(fill=drv),position="dodge")
ggplot(data=ggplot2::mpg) +
geom_point(mapping=aes(x=displ,y=hwy))
ggplot(data=ggplot2::mpg) +
geom_point(mapping=aes(x=displ,y=hwy,color=class))
10. Time Series Analysis

You might also like