R-note Mar.18 创建/下标/运算
review
基本元素类型:
numeric,logical(逻辑运算:与或非),character,complex
mode()查询类型
is.()判断类型
as.()强制转换
mode class区别:
在R里面,每一个对象都有一个mode和一个class。
前者表示对象在内存中是如何存储的。 (numeric, character, list and function)
后者表示对象的抽象类型。
d <- data.frame(V1=c(1,2))
class(d)
[1] "data.frame"
mode(d)
[1] "list"
data.frame() & list()
可以储存不同类别的元素,为常用的一种存储方式
数据框/list 产生函数
data.frame(colname1,colname2,colname3)
> col1 <- c(1:3)
> col2 <- c(1:3)
> col3 <- c(3:5)
> x <- data.frame(col1,col2,col3)
> x
col1 col2 col3
1 1 1 3
2 2 2 4
3 3 3 5
> y <- list(1:10,x=x)
> y
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
$x
col1 col2 col3
1 1 1 3
2 2 2 4
3 3 3 5
matrix()
- byrow=TRUE
x<- matrix(cell,col=n,row=n,byrow=T/F)
seq()
seq(from=,to=,by=)
> seq(1,15,pi)
[1] 1.000000 4.141593 7.283185 10.424778 13.566371
多用于画图
rep()[常用]
rep(x,times=,length.out=NA,each=)
length.out通常不用输入
> rep(1,times=10)
[1] 1 1 1 1 1 1 1 1 1 1
> rep(1:3,times=3)
[1] 1 2 3 1 2 3 1 2 3
> rep(1:3,each=2)
[1] 1 1 2 2 3 3
> rep(1:3,each=2,times=3)
[1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3
下标的提取
利用逻辑值来进行筛选:
> x <-seq(1,100,by=pi)
> x[x<40 & x>7] ###提取大于7小于40的元素
[1] 7.283185 10.424778 13.566371 16.707963 19.849556 22.991149 26.132741 29.274334
[9] 32.415927 35.557519 38.699112
应用:去除缺失数值
> age <- c(1,3,NA,2,NA,9)
> badindex=is.na(age)
> badindex
[1] FALSE FALSE TRUE FALSE TRUE FALSE
> badindex2=!is.na(age)
> badindex2
[1] TRUE TRUE FALSE TRUE FALSE TRUE
> age[badindex2]
[1] 1 3 2 9
> age[!is.na(age)]
[1] 1 3 2 9
注意: !表示逻辑值反转
- 去除多个向量中的缺失数据:
> age <- c(1,3,NA,2,NA,9)
> weight <- c(4.4,5.3,NA,NA,5.2,8.5)
> goodindex <- complete.cases(age,weight)
> goodindex
[1] TRUE TRUE FALSE FALSE FALSE TRUE
矩阵的元素引用
> x <- matrix(1:16,4,4)
> x
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
> x[2,2]
[1] 6
> x[2,]
[1] 2 6 10 14
> x[,2]
[1] 5 6 7 8
> x[3] ###不加逗号会按照竖排顺序引用
[1] 3
> x[c(1,2),c(3,4)] ###利用向量提取子阵
[,1] [,2]
[1,] 9 13
[2,] 10 14
读取data.frame
利用attach,detach 加上相应名字即可
或者:DataFrameName$ColName
读取列表
> x <- list(foo=1:4,bar=matrix(1:6,2))
> x
$foo
[1] 1 2 3 4
$bar
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> x[[1]]
[1] 1 2 3 4
> x$foo
[1] 1 2 3 4
> x[[2]]
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> x$bar
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
基本同data.frame()
下标运算总结
正的下标:提取对应元素;负的下标:去除对应元素;逻辑运算:提取T的元素
example:矩阵的逻辑提取
> x<-matrix(1:25,5,5)
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
> x[2,x[3,]>8]
[1] 12 17 22
> x[-2,x[3,]>8]
[,1] [,2] [,3]
[1,] 11 16 21
[2,] 13 18 23
[3,] 14 19 24
[4,] 15 20 25
运算
向量运算
- 加减乘除向量长度必须一样,每个分量分别去做
which(x==3):提取3的下标(所有,与*python不同)
> x<-c(-1,-2,0,4,5)
> x[which(x>0)]
[1] 4 5
常用向量运算函数
+, -, *, /, ^, %%, %/%
< > <= >= == ==… !=…
sin,cos,tan,asin,log,log10,exp
max(x),min(x),range(x)##返回c(min(x),max(x))
sum(x)
diff(x) ##差分
> x<-c(1,2,3,6,76,10)
> diff(x)
[1] 1 1 3 70 -66
prod(x) ##连乘
abs(x) ##绝对值
sqrt(x)=x^0.5
矩阵运算
> x <- matrix (1:4,2,2)
> y <- matrix(rep(10,4),2,2)
> x * y ###各个分量单独做乘法
[,1] [,2]
[1,] 10 30
[2,] 20 40
> x %*% y ###矩阵乘法
[,1] [,2]
[1,] 40 40
[2,] 60 60
rownames(x) <- c(‘row1’,‘row2’);colnames <- c(‘col1’,‘col2’) 命名
as.vector(x) 矩阵拉直
apply(x,2,sum) 按列求和
apply(x,1,sum) 按行求和
> x <- matrix(1:50,5,5)
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
> apply(x,1,sum)
[1] 55 60 65 70 75
> apply(x,1,diff)
[,1] [,2] [,3] [,4] [,5]
[1,] 5 5 5 5 5
[2,] 5 5 5 5 5
[3,] 5 5 5 5 5
[4,] 5 5 5 5 5
- 我们可以在apply中应用任何函数
apply(x,2,'MyFunction')
其他矩阵计算函数
t(x) 转置
diag(x) 对角阵/元素
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
> diag(x)
[1] 1 7 13 19 25
> diag(diag(x))
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 0 7 0 0 0
[3,] 0 0 13 0 0
[4,] 0 0 0 19 0
[5,] 0 0 0 0 25
solve(a,b) 运算a %*% x=b得到x
solve(a)矩阵的逆
因子
- Factors: categorical varable属性变量
- 主要目的是用来分类,计算频数和频率
factor(x=character(),levels,labels=levels)
gl(n,k,length=n*k,labels=1:n,ordered=FALSE)
###n:水平数;k:每个因子重复次数;length:总长度(类似rep中each和times)
> gl(3,2,18)
[1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3
Levels: 1 2 3
字符串
- 用于大规模执行、成批量输出时进行文件命名
paste
可以将多个字符串连接成一个向量
paste(...,sep=' ',collapse=NULL,recycle0=FALSE)
###默认分隔为空格
> paste(“hello”,“world”,“!”)###默认空格分隔
[1] "hello world !“
> paste(“Lec”,1,“.txt”,sep=“”)###用sep=“”调整分隔
[1] "Lec1.txt"
> paste("Lec",1,".txt",sep="*")
[1] "Lec*1*.txt"
- 合并字符型向量
x <- c("a","b", "c", "d", "e")
y <- c("A", "B", "C", "D","E")
> paste(x, y, sep = "-")
[1] "a-A" "b-B" "c-C" "d-D" "e-E"
> paste(x, y, sep = "")
[1] "aA" "bB" "cC" "dD" "eE“
> paste(4:9, rep("th", 6), sep = "") ##会先把字符转化为字符串
[1] "4th" "5th" "6th" "7th" "8th" "9th"
- collapse
可以将返回的所有向量都连成一个字符串,可以用collapse参数实现
> paste(x, y, sep = "-", collapse = "*")
[1] "a-A*b-B*c-C*a-D*b-E"
字符串的其他函数
- strsplit()
strsplit(*str,sep='')
- grep()
grep(pattern, *str, ignore.case = FALSE, value = FALSE)
pattern: 正则表达式
ignore.case=T/F: T为忽略大小写
value=T/F: T为返回值,F为返回位置
数据的外部输入和外部输出
外部文件输入read.table/scan/csv()
read.table()
- read.table(file,header,sep,…)
file: 文件路径
header=T/F: 识别标题
sep=’’: 分隔符
StringAsFactor=T/F: 是否想要把字符变成因子
scan()
- scan(file,what,sep,…)
what:指定变量名和类别
得到一个列表list;可以读进不规则的数值文档
read.csv
read.csv((file,header,sep,quote='\'',dec='.',...)
quote:换行符
dec=’’: 小数点字符
- 一般无表头,空格分隔的txt用read.table;有表头,用逗号分隔的csv用read.csv
数据输出
write.table()
write.table(data,file='',quote=T,sep='',eol='\n',na='NA',...)
• data:矩阵或者数据库,写到文件 name.txt
• quote:如果quote为TRUE,字符和因子列就会被 ("")所包围;
• sep是字段分隔符;
• eol为尾行分隔符;
• na为缺失值字符串;
cat()[重点]
cat(..., file=”", sep=” “, append=FALSE)
append:指明输出结果是否加入到原有文件
注意:使用cat()时要自己加上换行符’\n’