向量
(x<-c(10,11,14,15)) #外面带个括号就可以直接执行了
(x<-1:10)
(x<-seq(5,by=2,length=4)) #从5开始,等差是2,长度是4
(y<-seq(10,by=3,along.with=x)) #长度由x决定
(y1<-rep(x,times=3)) #repeat x作为模版,重复三次
(y2<-rep(x,each=3)) #x作为模版,每一个元素都重复三次
(y3<-rep(x,each=2,times=3)) #each 和 times 好像没有先后顺序 先每个元素复制两边,再整体重复3次
(y4<-rep(x,times=2,each=3)) #先每个元素复制三遍,再整体重复2次
(y5<-rep(x,times=2,each=3,length=15)) #多了个限制长度=15
(y6<-vector(mode="logical",length=4))
(y1[-1:-5]) #去掉y1中第一个到第五个元素 也可以y1[-5:-1] 负号就是删除了
(which(y1<10)) #输出的是下标
(y1[which(y1<10)]) #注意用的是[],外面多个y1就输出的是值了,如果要取里面的值用的都是[]
length(y1) #查看长度
mode(y1) #查看y1每个元素的数据类型 然后y1是numeric
class(y1) #查看y1整体的数据类型 然后y1还是numeric
生成向量:
x<-c(x1,x2,....) 常用
里面的rep(重复的)和seq(....)感觉没什么用
y6就默认生成的FALSE
取其中的数据用的是[]中括号
mode看内部每个元素的类型,class看整体的类型,str()也是可以看类型的详细一点
因子
(x<-factor(c('a','a','b','ab','o'))) #按字母顺序排等级levels
unclass(x) #用来查看因子变量的数值
(x1<-factor(c('a','a','b','ab','o'),levels=c('o','a','b','ab')))
(x2<-gl(4,3,labels=c('red','yellow','blue','green'))) #4个级别,重复三次,labels里面是等级顺序
mode(x2);class(x2)
factor形成因子,里面可以加levels=c(),自己定义因子的等级,默认就是按字母顺序
factor里面加的是c()
gl()函数感觉用处也不大
unclass(x)用来查看因子里面对应的等级,输出的数
其中的转换
(x<-c(1,TRUE,'wode')) #1和TRUE自动转化为了字符串,安全程度:字符串>数字>布尔类型 这些是隐式转换
mode(x);class(x) #都是character
x2<-1:4
(y<-as.character(x2)) #还可以显式转换
当用c来定义向量的时候,如果里面的参数的类型不一样,会自动转换
as.character(x) 显性转换参数类型
矩阵
生成矩阵
#方法1
(y<-matrix(1:18,nrow=6,ncol=3)) #默认的是按列竖着排序
(y<-matrix(1:18,nrow=6,ncol=3,byrow=T)) #True 就改成了按行来排序生成数字了 row行 col列
(y<-matrix(1:18,nrow=6,ncol=3,byrow=F))
c<-matrix(1:16,8) #还可以这样,究极省略,一个数8就默认是行(先行后列)
#方法2
(x<-1:18)
dim(x)<-c(3,6);x #就先生成一堆数,再按3*6的维度来摆放
#方法3
(x<-1:10)
(y<-11:20)
(z<-21:30)
(m1<-rbind(x,y,z)) #按行组装
(m2<-cbind(x,y,z)) #按列组装
mode(m1);class(m2)
提取矩阵中的元素
这些提取都是 [ ] 中括号的 以及给其中的列行取名字
#提取矩阵中的元素
(y<-matrix(1:18,nrow=6,ncol=3))
y[2,3] #注意是中括号
y[2,]
y[,c(1,3)] #所有行,1,3列的
y[c(1,3),c(1,3)]
#给行列名字取名字
colnames(y)<-c("列1",'列2','列3')
rownames(y)<-c('行1','行2','行3','行4','行5','行6') #就好像不可以中文,会乱码
colnames(y)<-c("l1",'l2','l3');rownames(y)<-c('h1','h2','h3','h4','h5','h6')
y['h1','l2'] #记得加双引号
y[2,3]<-NA #将y的2,3元素变为缺失值
is.na(y)
y[is.na(y)]=0 #把缺失值赋予0
矩阵的运算
m1<-matrix(1:12,nrow=3)
m2<-matrix(13:24,ncol=4)
m1;m2
m1+10 #m1每个元素+10
m1+m2 #m1和m2各个对应的元素相加
m1*10 #每个元素*10
m1*m2 #对应元素相乘
m1%*%t(m2) #矩阵的乘法,行列相乘,前列=后行所以t(m2)要先转置
对角阵
diag(4) #4阶单位阵
diag(c(1,2,5,8)) #对角上的元素是1258
a<-matrix(1:16,nrow=4)
diag(a) #如果是diag一个方阵,返回的就是对角上的元素了
b=solve(a)
a<-matrix(rnorm(16,10,2),4,4) #rnorm里面是随机生成数符合正态分布
b<-solve(a) #sovle是求逆
a%*%b
c<-1:4
solve(a,c) #线性方程组求解x1x2x3x4
数据框
数据框的生成:data.frame()就里面可以加列的名字,
里面有rnorm和runif函数:就都是随机生成的函数
runif(n,min,max)
rnorm(n,mean=30,sd=1) n个,平均值是mean,方差是1,默认mean=0,sd=1
通过attach(数据框名字)和detach(数据框名字)来省略
当然了还能用with()
with()不太会用
within()好点
within(数据框名, {修改1;修改2;修改3;......})或者within(数据框名,{修改1
修改2
修改3})
search() 用来查看当前的环境,检查,会不会还在某个数据框的attach里面
(a<-data.frame(fx=rnorm(10,10,2),fy=runif(10,10,20),fmonth=1:10))
#自己生成一个数据框,rnormhe runif都是随机生成
a[3,2]
a[3,] #提取里面的元素,跟矩阵一样的
y1<-a[1];y2<-a[[1]] #前面这个一个[]的就按列显示了,后面这个2个[]的就按行展示了,
#前面这个返回的是数据框的第一列,按数据框的格式返回了
mode(y1);class(y1);mode(y2);class(y2) #但前面这个是列的数据框了,后面这个就是向量了
y1<-a['fx'];y2<-a[['fx']] #也可以按列名来操作
y3<-a$fx #就是fx限定到了a里面,但如果每次就要打这个就没麻烦,就可以用下面的attach detach和with函数
attach(a) #attach 限定到了a里面,detach是解除,可以用search来查看当前的环境
#如果连续执行了三次attach(a)就需要三次detach(a)来解除
fx
detach(a)
search()
with (a,{
fx=rnorm(10,10,20)
}) #打括号相当于构造了一个搜索路径,对象是a
#但是好像这段没有赋值,fx=norm没什么用
a<-within(a,{
fx=1:10
abc=2:11
}) #就往a里面多加了一个abc列,而且a里面的fx列也改成了这个
a$fz<-a$fx+a$fy # 这也是向a里面多加一列的方法
a<-transform(a,fq=a$fx+a$fy) #也是加一列 或者修改原有的一列的元素
edit(a) # 去修改矩阵a里面的元素 但是只是编辑 保存的话还有再来个b
b=edit(a)
fix(a) #但是用fix修改编辑了之后就可以从保存了
列表
可以是向量、矩阵、数据框、其他列表的组合
a<-list(x=1:10,y=matrix(1:16,4),z=data.frame()) #然后出来三块两层的第一层就是该块的名字:$名字
names(a) #就看里面块的名字
c=a[1] #就是取a里面的第一块 但这个取得有$x的名字的
c=a[[1]] #这个取得就没$x的名字,是向量的形式
mode(a);class(a)
数组:用得少。略
array
判断类型
is.list(a) #看他返回TRUE还是FALSE
is.data.frame(a)
a<-matrix(1:20,4)
mode(a) #显示的是里面的元素是什么类型就数啊字符串什么的应该
class(a) #但感觉还是直接class看类型 ,就矩阵既可以是矩阵也可以是数组
str(a)
补充
a<-list(x=1:10,y=matrix(1:16,4),z=data.frame())
str(a) #还有就可以用str来看 这是structure的缩写 不是字符串
# $ x: int [1:10] 1 2 3 4 5 6 7 8 9 10
# $ y: int [1:4, 1:4] 1 2 3 4 5 6 7 8 9 10 ...
# $ z:'data.frame': 0 obs. of 0 variables
#然后显示了上面这三行,第一行int后面就这样[1:10]一组 就向量, 第二行 有两组[1:4]就是矩阵
一些语句
#①
if(condition){
...
}else{
...
}
#②
x<-1:10
y<-ifelse(x%%2==0,'A','B') #%%是取余数 如果=0就出A,反之出B
#循环结构
#③
for (x in 1:5) {
print(x^2)
}
#④
i=1
repeat{
print(i^2)
i=i+1
if (i>5) break
}
#⑤
i=1
while(i<6){
print(i^2)
i=i+1
}
函数
myadd=function(a,b,c){
return(a+b+c)
}
f=myadd(1,3,2)
f
#还有就是在其他的.R文件中引用这里的Function
#就要用source('/Users/chenyipeng/desktop/第一章--向量.R')
向量化计算和apply家族
x<-data.frame(pv=rnorm(100,20,3),
uv=rnorm(100,40,4),
ip=runif(100,40,50))
apply(x,MARGIN = 2,mean) #这个margin是看行(1)的维度还是列(2)的维度
apply(x,MARGIN = 2,quantile,probs=c(0.1,0.5,0.9)) #quantile分位数,后面要有probs跟着 分位的