R学习笔记 note-3

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"
字符串的其他函数
  1. strsplit()
    strsplit(*str,sep='')
  2. 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’

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值