R语言教程

Day1(2020.9.12)

1.向量赋值

X1<-c(1,2,5,7,9)

X1

运行结果 [1] 1 2 5 7 9


x2<-c("one","two","three")

x2

运行结果 [1] "one"   "two"   "three"


x<-1:8

x

运行结果 [1] 1 2 3 4 5 6 7 8

x=c(1,2,4)

which(x==4)

运行结果


2.判断数据类型

typeof(3)

运行结果 "double"    #双精度浮点数型变量

typeof(sqrt(2))

运行结果 "double"    #双精度浮点数型变量

typeof("3")

运行结果 "character"  #字符向量

typeof(1:10)

运行结果 "integer"    #整数型变量

     typeof(2L)

运行结果 "integer"    #整数型变量


3.比较大小

5 > 3

运行结果 [1] TRUE

5 == 3

运行结果 [1] FALSE

sqrt(2)^2==2L

运行结果 [1] FALSE

sqrt(2)^2-2L

运行结果 [1] 4.440892e-16

注:数据类型不同,导致不能划等号


4.随机取数,比较大小,求平均数     

x<-sample(1:20,56,replace = TRUE)

x

运行结果  

[1]  8 15  5  19  9  3  2 14 12 19  9  5 20  1 10  4  7 10 12  9  7  2  5 18 17 10  1  5 17  4 19 13 18 17  6 20 16 16 10 13 15  2 17 17 17 12 14 17 12 18  2 10 15 17

[55]  1  5

注:replace = TRUE 意味着可重复取数,不写replace = TRUE 则意味着replace = FALSE


x<-sample(1:200,56)

x

运行结果  

[1] 165  11 158 174  95 191  90  98  83  96 187 128  51 182 188  84  35  91  22 125  78 175  71 120  26 145   9 162  89 153 123 172  65  69  50  81 155 170  68  60

[41] 111  48  14 167 184  54  73  30 190  18  49 200  88 197   5 183


y<-x>10

   y

运行结果  

  [1]  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE

[28]  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE

[55]  TRUE FALSE


sum(y)  

运行结果

[1]26

统计TRUE个数


mean(y)

运行结果

[if !supportLists][1] [endif]0.5357143


5.向量加减乘除,取数

    x<-c(1,3,5,9)

y<-c(2,4,0,0)

x+y

运行结果

[1]3 7 5 9

R语言中的向量加减乘除都是相应元素做相应运算,与矩阵运算不同


x[c(3,2)]

运行结果

  [1] 5 3


x[c(-1,-2)]

运行结果 

[1] 5 9


构造矩阵

r<-c(2,4,6,8)

s<-c(1,3,5,7,9)

    matrix(1:20,nrow=4,ncol=5,byrow=FALSE,dimnames = list(r,s))


注:byrow=FALSE 意味着数字按列进行填充,byrow=TRUE 意味着数字按行进行填充,dimnames 命名矩阵行名为r,列名为s


6 随机取数

y<-runif(10)  

y

运行结果 

[1] 0.61662889 0.34232064 0.04924143 0.27833236 0.56129433 0.08877241 0.19762784 0.26354030 0.74634281 0.88279118

均匀分布,在0—1间随机取10个数输出


y<-runif(min=2,max=3,10)

hist(y)  


频数分布直方图纵轴表示频数



7 判断语句,筛选数据

is.vector()  #是否为向量

is.atomic()  #判断是否为原⼦向量

is.integer(rep(1.0,3))  #判断是否为整数

is.logical  #判断是否为逻辑值


x <- c(10,3,NA,5,8,1,NA)

x

运行结果 

[if !supportLists][1] [endif]10  3 NA  5  8  1 NA

x[!is.na(x)]

运行结果 

[if !supportLists][1] [endif]10 3 5 8 1


x <- c(10,3,5,8,1) 

x[x%%2==0]

运行结果

[if !supportLists][1] [endif]10  8


x <- c(2,7,9,4,3)

which(x > 5)   #找出比5大的数的序号

运行结果

[if !supportLists][1] [endif]2 3

x[which(x>5)]   #找出比5大的数 或subset(x,x>5)

运行结果

[if !supportLists][1] [endif]7 9


y<-c(rep(TRUE,10),rep(NA,5))  

y

运行结果

[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE   NA   NA   NA   NA   NA

subset(y,is.na(y))

运行结果

[if !supportLists][1] [endif]NA NA NA NA NA


8 制作数表

patientID <- c(1001,1002,1003,1004)

age <- c(25,34,28,52)

diabetes <- c("Type1","Type2","Type3","Type4")

status <- c("Poor","Improved","Excellent","Poor")

patientData <- data.frame(patientID,age,diabetes,status,stringsAsFactors =TRUE)  

 #stringsAsFactors =TRUE不改变数据类型,向量均为列向量

patientData

运行结果

 patientID age diabetes    status

1      1001  25    Type1      Poor

2      1002  34    Type2  Improved

3      1003  28    Type3 Excellent

4      1004  52    Type4      Poor


patientData[1:2]

运行结果

  patientID age

1      1001  25

2      1002  34

3      1003  28

4      1004  52

patientData$patientID

运行结果

[if !supportLists][1] [endif]1001 1002 1003 1004

patientData$diabetes[1:2]

运行结果

[1] Type1 Type2

patientData[[3]][2]    #输出第三列的第二行

运行结果

[1] Type2

patientData[patientData$age > 50,]

#把第二列大于50的元素所在行m找出,输出矩阵的m行

运行结果

  patientID age diabetes status

4     1004  52    Type4   Poor

9 正态分布,取样

r_norm_100 <- rnorm(n = 100,mean = 75,sd = 5)

r_norm_100

#均值为75,标准差为5的样本容量为100的样本

运行结果

[1] 75.29565 68.48863 70.23112 72.39606 76.82377 74.25589 81.28329

  [8] 77.80672 76.95731 75.23253 72.16808 85.40307 74.85992 81.31294

 [15] 72.98449 66.73635 70.23438 65.92539 78.18097 78.26328 76.82686

 [22] 72.87735 67.99540 72.68910 74.32979 79.67451 76.61294 69.80192

 [29] 69.01737 70.66575 73.33984 81.99594 77.01316 70.75914 73.84825

 [36] 80.86699 76.27589 80.46859 65.76615 75.78926 71.36707 77.38824

 [43] 71.49119 69.27226 69.05029 77.00118 79.39479 76.84189 68.41231

 [50] 79.63202 74.62925 72.20964 69.63242 72.96685 86.76448 69.90287

 [57] 81.22189 76.19720 68.44990 75.99319 78.41305 64.01369 82.14914

 [64] 71.93142 78.75947 75.57412 82.31062 68.88217 78.79258 71.35864

 [71] 79.11946 78.39555 75.22160 78.52649 78.82171 75.85492 71.77475

 [78] 78.91031 79.14251 72.95451 67.38387 83.55844 72.01968 70.92477

 [85] 71.17984 70.50099 66.04652 65.82491 71.95508 77.16544 72.96861

[92] 78.19887 81.06867 68.87328 81.28249 83.69302 65.14295 68.48148

 [99] 83.10060 74.12507


10 计算圆周率PI

CNT <- 10000

x <- runif(CNT,min = -1,max = 1)

y <- runif(CNT,min = -1,max = 1)

a <- sum((x^2+y^2)<=1)

b <- CNT

pi=4*a/b  

  pi

 运行结果

[if !supportLists][1] [endif]3.1392

11 设定随机数种子,让模拟可重复出现

set.seed(12)

x1 <- rnorm(20,mean = 5,sd = 1)

x2 <- rnorm(20,mean = 5,sd = 1)

x1

x2

运行结果

 [1] 4.103085 5.184849 6.587845 3.869624 4.919748 5.132420 5.707955 4.760302

 [9] 6.984474 4.861213 5.417651 5.981753 4.607305 3.960331 6.782229 2.688931

[17] 5.878605 5.035807 6.012829 5.432265


[1] 7.090819 3.800074 6.589638 6.954652 5.004938 2.548294 5.477237 4.403442

 [9] 5.792203 5.289637 5.738939 5.318960 6.076164 4.715842 4.223325 4.404340

[17] 3.274020 4.097416 4.440938 4.753487

12 绘图:散点图

ggplot(data = mpg) + geom_point(mapping = aes(x = displ,y = hwy, color= class))

或者:

ggplot(data=mpg,mapping=aes(x=displ,y=hwy))+geom_point()

或者:

ggplot()+geom_point(data=mpg,mapping=aes(x=displ,y=hwy,color=class))

#displ放在x轴,hwy放在y,绘制散点图,不同的车型用不同颜色标注;color= class若换成size = class,则不同的车型用不同大小的点标注;color= class若换成alpha= class,则不同的车型用不同程度的黑色点标注;color= class若换成shape =class,则不同的车型用不同形状的点标注。

运行结果


ggplot(data = mpg) + geom_point(mapping = aes(x = displ,y = hwy),color = "blue")

  #displ放在x轴,hwy放在y,绘制散点图,点用蓝色标识。


ggplot(data = mpg) +

  geom_point(mapping = aes(x = displ,y = hwy)) +

  facet_wrap(~class,nrow = 3)

 #displ放在x轴,hwy放在y,绘制散点图,不同的车型分面显示,分成3行。




Day2(2020.9.13)

1 绘图:平滑曲线

ggplot(data=mpg)+geom_smooth(mapping=aes(x=displ,y=hwy,linetype=drv))

#displ放在x轴,hwy放在y,绘制平滑曲线,不同的drv用不同曲线标注。

运行结果



ggplot(data=mpg,mapping=aes(x=displ,y=hwy))+geom_point(mapping=aes(color=class))+geom_smooth()

运行结果


ggplot(data=mpg)+geom_smooth(mapping=aes(x=displ,y=hwy,color=drv),show.legend = TRUE)

#displ放在x轴,hwy放在y,绘制平滑曲线,show.legend = TRUE(或省略)表示显示颜色代表的含义,show.legend = FALSE会隐藏最右边的颜色列。

运行结果



ggplot(data=mpg,mapping=aes(x=displ,y=hwy))+

geom_point(mapping=aes(color=class))+geom_smooth(data=filter(mpg,class=="subcompact"),se=FALSE)

#filter筛选,standard error标准误,去掉阴影部分


运行结果



2 绘图:条形图及上色


ggplot(data=diamonds)+geom_bar(mapping = aes(x=cut))

或者

ggplot(data=diamonds)+stat_count(mapping=aes(x=cut))


ggplot(data=diamonds)+geom_bar(mapping = aes(x=cut,y=..prop..,group=1))

#纵坐标变成所占比例,和为1。

运行结果


ggplot(data = diamonds) +

  stat_summary(

    mapping = aes(x=cut, y=depth),

    fun.ymin = min,

    fun.ymax = max,

    fun.y = median

  )

#stat_summary为每一个x计算出y的摘要统计,median为中位数。

运行结果



ggplot(data = diamonds) +

  geom_bar(mapping = aes(x=cut,color =cut))

#为每一个cut的矩形边框上色。

运行结果


ggplot(data = diamonds) +

  geom_bar(mapping = aes(x=cut,fill =cut))

#为每一个cut的矩形上色。

运行结果



ggplot(data = diamonds) +

  geom_bar(mapping = aes(x=cut,fill = clarity))


#为每一个cut的矩形按种类上色。

运行结果


ggplot(data = diamonds) +

  geom_bar(

    mapping = aes(x=cut,fill = clarity),

    position = 'dodge'

  )

#为每一个cut的矩形按种类上色,把每个种类分离出来。

运行结果


ggplot(data=mpg) +

  geom_point(

    mapping = aes(x=displ,y=hwy),

    position = "jitter"

  )

#position = "jitter",给每个数据点添加一个很小的随机扰动,把重叠的点分散出来。

运行结果



ggplot(data=mpg)+geom_boxplot(mapping=aes(x=class,y=hwy))

#画箱线图

运行结果



ggplot(data=mpg)+geom_boxplot(mapping=aes(x=reorder(class,hwy,FUN=median),y=hwy))

#reorder对箱线图进行重新排序,排序基于hwy值的中位数对class进行排序。





3 数据转换

filter(flights, month==12,day==25)

#筛选出12月25日所有航班

运行结果


filter(flights, (month==1 & day==1) | (month==12 & day==25))

#筛选出1月1日及12月25日所有航班,&表示与,|表示或。

运行结果


arrange(flights,year,month,day)

#对flights按照year,month,day的次序,从小到大进行排序。

运行结果


arrange(flights,desc(arr_delay))

#对flights按照arr_delay从大到小排序。

运行结果


rename(flights, tail_num=tailnum)

#对flights中的变量tailnum重新命名为tail_num。

运行结果


select(flights, time_hour, air_time, everything())

#将flights中的变量time_hour、 air_time移到数据框开头。

运行结果


flights_sml <- select(flights,

                      year:day,

                      ends_with("delay"),

                      distance,

                      air_time

)

#将flights中的变量year,month,day移到数据框开头,接着把以“delay”未后缀的变量放在后面,再接着把  distance,air_time放后面。

mutate(flights_sml,

       gain = arr_delay - dep_delay,

       hours = air_time / 60,

       gain_per_hour = gain / hours

)

#在flights后面,添加gain、 hours、 gain_per_hour等3个变量。再输入flights_sml,结果没有gain、 hours、 gain_per_hour等新变量。

运行结果


transmute(flights_sml,

          gain = arr_delay - dep_delay,

          hours = air_time / 60,

          gain_per_hour = gain / hours

)

#只保留flights_sml里面的gain、 hours、 gain_per_hour等3个变量。

运行结果



by_day <- group_by(flights, year, month, day)

summarize(by_day, delay = mean(dep_delay, na.rm = TRUE))

#group_by将分析单位从flights更改为单个分组,summarize为分组摘要,na.rm = TRUE,把NA都丢掉。

运行结果


by_dest <- group_by(flights, dest)

delay <- summarize(by_dest,

count = n(),

dist = mean(distance, na.rm = TRUE),

delay = mean(arr_delay, na.rm = TRUE)

)

delay <- filter(delay, count>20,dest!="HNL")

ggplot(data=delay,mapping=aes(x=dist,y=delay)) +

  geom_point(aes(size=count),alpha=1/3) +

  geom_smooth(se=FALSE)

#alpha=1/3,圆点的透明度为1/3,越小越透明,se标准误,去掉阴影部分


#用管道重写上述代码

delays <- flights %>%

  group_by(dest) %>%

  summarize(

    count = n(),

    dist = mean(distance,na.rm=TRUE),

    delay = mean(arr_delay, na.rm = TRUE)

  ) %>%

  filter(count > 20, dest != "HNL")

ggplot(data=delays,mapping=aes(x=dist,y=delay)) +

  geom_point(aes(size=count),alpha=1/3) +

  geom_smooth(se=FALSE)

 #%>%读作“然后”,x %>% f(y)会转换为f(x,y)

not_cancelled <- flights %>%

  filter(!is.na(dep_delay), !is.na(arr_delay))

not_cancelled %>%

  group_by(year,month,day) %>%

  summarize(mean = mean(dep_delay))

#filter(!is.na(dep_delay), !is.na(arr_delay))把NA值删去。

3 定义函数

MEM <- function(x,y,t){

  t*x*y^2

}

MEM(1,2,3)

运行结果


4 循环语句

sum<-0

for(i in 1:100)

  sum=sum+i

print(sum)

运行结果


sum<-1

for(i in 1:5)

sum=sum*i

print(sum)

运行结果


TEST2 <- function(n){

  sum <- 1

  for(i in 1:n)

    sum = sum*i

  print(sum)

}

TEST2(6)

运行结果


sum <- 0

i<-1

while(sum<10000){

  sum=sum+i

  i<-i+1

}

print(i)

运行结果


x<-c(3,5,4,-1,6,9,-2,3,7,8)

y<-NA

i<-1

for(n in x){

  if(n

    y[i]=n*2

  if(n>mean(x))

    y[i]=n/2

  i=i+1

}

print(y)

#或者

x<-c(3,5,4,-1,6,9,-2,3,7,8)

mx<-mean(x)

for(i in c(1:length(x))){

  if(x[i]>mx) x[i]<-x[i]/2

  else if (x[i]

i=i+1}

x

运行结果



sum<-NA

sum[1]<-1

i<-1

while(sum[i]+i+1<10000){

  sum[i+1]<-sum[i]+i+1

  i<-i+1

}

sum

运行结果


Day3(2020.9.19)

1.理解连接

x <- tribble(

  ~key, ~val_x,

  1, "x1",

  2, "x2",

  3, "x3"

)

y <- tribble(

  ~key, ~val_y,

  1, "y1",

  2, "y2",

  4, "y3"

)

x

y

#构造2个数据框,x,y

运行结果


x %>%

  inner_join(y, by = "key")

 #内连接,显示匹配的行

运行结果



x %>%

  left_join(y, by = "key")

 #左连接,保留x中的所有观测

运行结果


x %>%

  right_join(y, by = "key")

 #右连接,保留y中的所有观测

运行结果


x %>%

  full_join(y, by = "key")

 #全连接,保留x,y中的所有观测


semi_join(x, y, by = "key")

#保留x表中与y表中的观测相匹配的所有观测。

运行结果


anti_join(x, y, by = "key")

#丢弃x表中与y表中的观测相匹配的所有观测。

运行结果



2.模型

ggplot(data = sim1) +

  geom_point(mapping = aes(x =x,y = y))

运行结果


models <- tibble(

  a1 = runif(250, -20, 40),

  a2 = runif(250, -5, 5)

)

models

#运行结果


nrow(models)

#运行结果,nrow只能对数据框操作,向量结果就是NULL。models是数据框,但models$a1是向量。


models <- tibble(

    a1 = runif(250, -20, 40),

    a2 = runif(250, -5, 5)

)

ggplot()+

    geom_abline(data=models,mapping = aes(intercept=a1,slope=a2),alpha=0.25)+

geom_point(data=sim1,aes(x=x,y=y))

#intercept截距, slope斜率

运行结果


#intercept 斜率, slop 截距

b<-function(p,q){

c<-sim1$y-(p+q*sim1$x)   #得到的是一个向量

d<-sqrt(mean(c^2))

d       #均方根误差,值越小,模型约逼真。print(d),只要运行函数b必输出结果。d明确求函数值才会有结果。

}

f<-mutate(models,e=purrr::map2_dbl(a1,a2,b))

f

 #函数purrr::代替循环,map2,长度为2的数值向量

#运行结果


min(f$e)

#运行结果,min(f)求f中最小值


ggplot()+geom_point(data=sim1,mapping = aes(x=x,y=y),size=2,color="grey30")+

 geom_abline(data=filter(f,rank(e)<=10),mapping =aes(intercept=a1,slope=a2,color=-e) )

 #画出模拟效果最好的十条直线,rank(e)<=10

#运行结果


#或画出模拟效果最好的十条直线,网格搜索法

i<-expand.grid(

g=seq(-5,20,length=25),  #把区间[-5,20]分成24等分的23个点+2个端点=25个点,25个点组成列向量

h=seq(1,3,length=25)

)

j<-mutate(i,k=purrr::map2_dbl(g,h,b))

ggplot()+geom_point(data=j,mapping=aes(x=g,y=h,color=-k))+

geom_point(data=filter(j,rank(k)<=10),mapping = aes(x=g,y=h),size=4,colour="red")

ggplot()+geom_point(data=sim1,mapping = aes(x=x,y=y),size=3)+   geom_abline(data=filter(j,rank(k)<=10),mapping=aes(intercept=g,slope=h,color=-k))


sim1_mod <- lm(y ~ x, data = sim1)

#或者

sim1_mod <- lm(data = sim1,y ~ x)

coef(sim1_mod)

#运行结果



k<-lm(data=sim1,y~x)

add_residuals(sim1,k)  #计算sim1与它的线性模型之间的差距,即残差。

#运行结果


a<-tribble(

    ~x,~y,~z,

    1,3,5,

    1,2,6)     #构造数据框命名为a

model_matrix(a,x~y) 


mod1<-lm(data=sim3,y~x1+x2)

mod2<-lm(data=sim3,y~x1*x2)

grid<-sim3

p<-data_grid(grid,x1,x2)  

 #找出x1、x2中的唯一值

q<-gather_predictions(p,mod1,mod2)

 #两个模型的预测值

q

#运行结果


ggplot()+geom_point(data=sim3,mapping = aes(x=x1,y=y,color=x2))+

    geom_line(data=q,mapping = aes(x=x1,y=pred,color=x2))+

facet_wrap(~model)

#运行结果






w<-gather_residuals(sim3,mod1,mod2)

ggplot()+geom_point(data=w,mapping = aes(x=x1,y=resid,color=x2))+

    facet_grid(model~x2)

 #不同的model、x2分面显示

#运行结果



 #mod2在b、d类模拟的效果,明显好于mod1。

你可能感兴趣的:(R语言教程)