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。