R语言是一个应用非常广泛的并且免费的用于统计计算和作图的计算机语言,无论什么和数据分析有关的行业,基本都会用到R。R 环境由一组数据操作,计算和图形展示的工具构成。它的特色在于:1.有效的数据处理和保存机制;2.完整的数组和矩阵计算操作符;3.连贯而又完整的数据分析工具;4.图形工具可以对数据直接进行分析和展示,同时可用于多种图形设备;5.它是一种相当完善,简洁而又高效的程序设计语言(也就是‘S’)。
基本的数据类型:
向量有一些基本运算:
求三角函数的值:sin(x),cos(x),tan(x)
向量开根号:sqrt(x)
求向量的和:sum(x)
向量的最大值和最小值:max(x) 和min(x)。
向量的范围:range (x)
向量的长度:length(x)
向量的均值:mean(x)
向量的方差:var(x)
向量的标准差:sd(x)
向量的累乘:prod(x)
数组可以看作是带有多个下标类型相同的元素集合,如数值型。
维度向量(dimension vector)是一个正整数向量。如果它的长度为k,那么该数组就是k-维的,例如矩阵是2-维数组。
数组只允许单一类型的值出现。
在R中数组用array()函数建立。
矩阵是一个2维的数组,一般用matrix()来构建一个矩阵,array()也可以创建一个2维数组(矩阵)。
例子:定义一个从1到20,行数为4,列数为5的矩阵。
向量的合并:
也可以用cbind()和rbind()函数将相同长度的向量接合成矩阵。
t()可以将矩阵进行转置,或用aperm()代替。
同样矩阵也可以做合并,同样是用rbind和cbind。
rbind和cbind,除能合并等长的向量外,还能合并数据框和矩阵。
矩阵工具:1).函数nrow(A) 和ncol(A) 将会分别返回矩阵A 的行数和列数.2).colnames(A)rownames(A)会分别返回矩阵A 的列名和行名。3).将一个数组强制转换成简单向量的标准方法是用函数as.vector(),或用c()。
因子(factor)是一个对等长的其他向量元素进行分类(分组)的向量对象。 R同时提供有序(ordered)和无序(unordered)因子。有序意味着以字母排序。
函数factor()引入因子。
函数levels()表示因子的水平。
有序因子:函数ordered() 用来创建有序因子。在其他方面,函数ordered() 和factor() 基本完全一样。大多数情况下,有序和无序因子的唯一差别在于前者显示的时候反应了各水平的顺序。
7.1. R 的列表(list)是一个以对象的有序集合构成的对象。列表中包含的对象又称为它的分量(components)。
7.2. 分量可以是不同的模式或类型,如一个列表可以同时包括数值向量,逻辑向量,矩阵,复向量,字符数组,函数等等。
7.3. 列表的建立采用list()函数,列表通过[[index/name]]进行访问。
8.1. 数据框(data frame)是一个属于“data.frame” 类的列表。
8.2. 数据框常常会被看作是一个由不同模式和属性的列构成的矩阵。它能以矩阵形式出现,行列可以通过矩阵的索引习惯访问。
8.3. 用data.frame()函数构建数据框。
q1, R2.15.3中runif的原型是runif(n, min = 0, max = 1),对应生成多少个随机数,均匀分布中的a和b;
关于两个max,第一个max=....是指函数runif中对应的max参数,其值是c(length(p) -0.5, max(p));第二个max是一个运算,其优先级高于runif,在runif之前就完成运算。故不矛盾。
总结一下,这两个max一个是参数名称,一个是函数运算。同理,多个max运算也不矛盾,max分别运算,结果分别保存,然后传递给runif函数。
break的总用是跳出最近的循环,也就是如果满足if的条件就跳出repeat;
q2,我的思路是,不保证对,仅做参考。
如果打41局,一定能分出胜负,如果仅考虑先得21分者胜的话;
二项分布x<-rbinom(41, size = 1, prob = 0.5) 模拟了两个人的比赛情况,0表示a输,1表示a赢。
函数func计算谁先得到21分;由于x中只有0,1,故可在21:41的长度区间内,依次用sum和长度判断1先到凑够21个还是0先凑够21个
func <- function(x){for (i in 21:length(x)){
if (sum(x[1:i]) >= 21) return ('a')
if (i - sum(x[1:i]) >= 21) return('b')
}
}
func(x)
funx(x) 计算出谁赢;
在这个基础上,通过重复多次上述过程,代码中500次,可以算出a赢的比例,即概率;
v <- vector(length=500)for (i in 1:500){
x<-rbinom(41, size = 1, prob=0.5)
v[i] <- func(x)
}
length(v[v=='a'])/500
随着重复次数的增加,这个概率最终趋近于0.5,也就是rbinom中的概率;
p.s. lz的题都不错,能否推荐下?
我自从学完R之后,一直也没怎么系统做题,做了几天题也挺有收获,在此也感谢下lz;
R语言-v1-基础知识
Iretara 12-17 21:18
以例题的形式简述R语言基础知识
# 读取文件
setwd(" 文件链接的时候,用 / ")
install.packages(" readxl ")
library(readxl)
library (tidyverse)
hw1_a<- read_excel ("hw1_a.xlsx", col_types=c("numeric", "numeric", "numeric", "numeric", "numeric") )
hw1_b<- read_excel ("hw1_b.xlsx")
#读取csv
library(readr)
hw1_a<- read_csv ("/")
View(hw1_a)
# 描述型函数
hw1_a + hw1_b 表
#描述最小值,最大值,中值,均值,标准差
Str (hw1_a) #查看数据并指出各个 变量的形式
summary (hw1_a) #指出各个变量的形式, 最小值,最大值,中值,均值
library(psych)
describe (hw1_a) #比summary更简便的方法, 可以直接读取标准差等;但是,使用describe不可读取 NA值, 可以尝试使用 Hmisc包中 describe
描述型函数-R
# 连接
hw1_a %>% inner_join (hw1_b, by ="ID")
hw1_a %>% left_join (hw1_b, by ="ID")
hw1_a %>% right_join (hw1_b, by ="ID")
hw1_a %>% full_join (hw1_b, by ="ID")
inner_join<- inner_join (hw1_a,hw1_b, by =“ID”) #报告合并后的 总行数 ,178行
full_join<- full_join (hw1_a,hw1_b, by ="ID")
( nrow (full_join)) #报告合并后的 总行数 ,200行
> length (full_join$ID)
#找出各个列的 缺失值
i<-NA
a<-NA
for(i in 1:length(full_join[1,])){ a[i]<- sum(is.na( full_join[,i] ) ) }
paste("缺失值是",a)
#缺失值总数
sum(is.na(full_join))
#删除缺失值 na.omit()
full_join1=filter(full_join,!is.na(full_join[2]))
full_join1=filter(full_join1,!is.na(full_join1[3]))
full_join1=filter(full_join1,!is.na(full_join1[4]))
full_join1=filter(full_join1,!is.na(full_join1[5]))
full_join1=filter(full_join1,!is.na(full_join1[6]))
full_join1=filter(full_join1,!is.na(full_join1[7]))
full_join1=filter(full_join1,!is.na(full_join1[8]))
sum(is.na(full_join1))
找出Income中的 极端值 并滤掉对应行的数据
quantile (hw1_a$Income,c(0.025,0.975))
hw1_a2= filter (hw1_a,Income>14168.81 &Income<173030.92)
#使用dplyr进行数据转换
arrange()
>arrange (hw1_a,Income) #默认升序
>arrange(hw1_a, desc (Income)) #desc降序,NA排序一般最后
select()
>select (hw1_a, - (Years_at_Address:Income)) #不要变量
>rename (hw1_a, In_come=Income) #改名
>select(hw1_a,Income, exerything ()) #把Income放在前面
拓例题1:
library(nycflights13)
view(flights)
#counts
(1)
not_cancelled <- flights %>%
filter(! is.na(dep_delay), !is.na(arr_delay))
(2)
not_cancelled %>%
group_by (year,month,day) %>%
summarize (mean=mean(dep_delay))
(3)
delays <- not_cancelled %>%
group_by (tailnum) %>%
summarize (delay=mean(arr_delay))
ggplot (data=delays,mapping=aes(x= delay))+
geom_freqpoly (binwidth=10) #freqpoly
(4)
delays <- not_cancelled %>%
group_by(tailnum) %>%
summarize(delay=mean(arr_delay,na.rm=TRUE), n=n() ) #tailnum的次数
ggplot(data=delays,mapping=aes(x= n, y=delay))+
geom_point(alpha=1/10)
拓例题2:
#请按照价格的均值,产生新的变量price_new, 低于均值为“低价格”,高于均值为“高价格”。 同样对市场份额也是,产生变量marketshare_new, 数值为“低市场份额”和“高市场份额”
price=data1$price
pricebar=mean(price)
price_new= ifelse (price>pricebar,“高价格”,”低价格”)
marketshare=data1$marketshare
marketsharebar=mean(marketshare)
marketshare_new=ifelse(marketshare>marketsharebar ,“高市场份额”,”低市场份额”)
data1= mutate (data1,price_new,marketshare_new)
#可视化
#将Income 对数化
lninc<- log (hw1_a$Income)
#画出直方图和 density curve密度曲线
hist (lninc,prob=T)
lines ( density (lninc),col="blue")
# 添加额外变量 的办法,在 aes()中添加 样式 (color、size、alpha、shape)
ggplot(data=inner_join)+
geom_point(mapping = aes(x=Years_at_Employer,y= Income, alpha= Is_Default))
# 按照Is_Default 增加一个维度,使用明暗程度作为区分方式
ggplot(data=inner_join)+
geom_point(mapping = aes(x=Years_at_Employer,y= Income,
alpha=factor( Is_Default ) ))
#使用形状作为另外一种区分方式
ggplot(data=inner_join)+
geom_point(mapping = aes(x=Years_at_Employer,y= Income,
shape=factor( Is_Default)))
可视化-R
拓展:
#将 flight1 表和 weather1 表根据共同变量进行内连接,随机抽取 100000 行数据, 将生产的结果保存为 flight_weather。 (提示:sample_n()函数,不用重复抽取)
flight_weather <- inner_join(flight1, weather1) %>% sample_n(100000)
# 从 flight_weather表中对三个出发机场按照平均出发延误时间排降序,并将结果保留在 longest_delay表中。把结果展示出来
longest_delay<- flight_weather %>%
group_by(origin) %>%
summarize(delay=mean(dep_delay, na.rm=TRUE )) %>%
arrange(desc(delay))
#根据不同出发地(origin)在平行的 3 个图中画出风速 wind_speed(x 轴)和出发 延误时间 dep_delay(y 轴)的散点图。
ggplot(data= flight_weather) +
geom_point(mapping=aes(x=wind_speed,y=dep_delay))+
facet_grid(.~origin, nrow = 3 ) # 按照class分类,分成3行
#根据 flight_weather 表,画出每个月航班数的直方分布图,x 轴为月份,y 轴是每个 月份航班数所占的比例。
ggplot(data=flight_weather)+
geom_bar(mapping=aes(x=month, y=..prop .., group=1))
#根据 flight_weather 表,画出每个月航班距离的 boxplot 图,x 轴为月份,y 轴为 航行距离, 根据的航行距离的中位数从低到高对 x 轴的月份进行重新排序
ggplot(data=flight_weather)+
geom_boxplot(mapping=aes(x= reorder (month,distance,FUN=median),y=distance))
线性回归
# 以Income作为因变量,Years at Employer作为自变量,进行 OLS回归
m1<- lm (Income ~ Years_at_Employer,data=hw1_a)
#通过***判断显著性
summary (m1)
#画出拟合直线
ggplot(data= hw1_a)+
geom_point(aes(x=Income,y=Years_at_Employer))+
geom_abline(data= m1,col= "blue")
#证明拟合直线是最优的
b0=runif(20000,-5,5)
b1=runif(20000,-5,5)
d<-NA
sum<-NA
n<-1
while(n<=20000){
for(i in 1:24){
d[i]<-(hw1_a $ Income[i]-b0[n]-b1[n]*hw2$ Years_at_Employer[i])^2}
sum[n]<-sum(d)
n<-n+1
}
resi=m1$residuals
resi2=sum(resi^2)
check=sum(as.numeric(sum<resi2))
check