最近在看一些R语言,顺便记录一下R语言的基础操作,以后查找方便
R语言更多的用于数据分析中,算是一个比较有特色的一个语言
学习的主要内容为
数据类型
数据结构
函数
控制流(判断循环)
文件读取
数据类型
R数据类型主要为字符character,数字numeric,和逻辑值logical
is.numeric()可以判断类型as.numeric()可转换类型,这与一般语言基本类似,不过一般数值型分为浮点、整型等
数据结构
结构主要为向量 数组 矩阵 数据框 列表等,向量是R语言的基础,单个数字也是单个向量,向量数据框类似于Python的pandas的series和dataframe,数组矩阵Python中主要是numpy库的函数
R 有几个特点,与Python类似,不必声明变量,变量创建时会自动识别类型,所有序号从1开始,这与大部分语言都不同(从0开始),注释与Python相同加#,但没有块注释(Python中为""" “”")
赋值是使用<-(快捷键alt±),真要用=其实也行
对于一个数据结构主要了解其生成,子集选择,相互运算
向量
生成方式有几种
> a <- c(1,2.3,4); a
[1] 1.0 2.3 4.0
> 1:4
[1] 1 2 3 4
> rep("a",times=3)
[1] "a" "a" "a"
> rnorm(n=3)
[1] -0.3918248 -0.4553021 0.2116822
> paste0(rep("a",times=3),1:3)
[1] "a1" "a2" "a3"
向量之间的运算
> b <- 1:5
> a==b
[1] TRUE FALSE FALSE FALSE FALSE
> b[6]=4
> a==b
[1] TRUE FALSE FALSE FALSE FALSE TRUE
两个长度不相等的向量比较会把短的进行循环比较
交并集
> union(a,b)
[1] 1.0 2.3 4.0 2.0 3.0 5.0
> setdiff(a,b)
[1] 2.3
> setdiff(b,a)
[1] 2 3 5
结果类似于Python的集合
子集的选择有两种,按照序列号选择,按照条件真值选择
如选择b中有a的数字,这个在pandas中类似于Series.isin()函数,其他的><=都可在括号内判断
> a
[1] 1.0 2.3 4.0
> b
[1] 1 2 3 4 5 4
> c = b[b %in% a];c # 这个在pandas中类似于Series.isin()函数,其他的><=都可在括号内判断
[1] 1 4 4
> a[-1] #-号为除去某个值,在Python中则为逆序选择
[1] 2.3 4.0
矩阵
> m = matrix(1:100,nrow = 10)
> m
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 11 21 31 41 51 61 71 81 91
[2,] 2 12 22 32 42 52 62 72 82 92
[3,] 3 13 23 33 43 53 63 73 83 93
[4,] 4 14 24 34 44 54 64 74 84 94
[5,] 5 15 25 35 45 55 65 75 85 95
[6,] 6 16 26 36 46 56 66 76 86 96
[7,] 7 17 27 37 47 57 67 77 87 97
[8,] 8 18 28 38 48 58 68 78 88 98
[9,] 9 19 29 39 49 59 69 79 89 99
[10,] 10 20 30 40 50 60 70 80 90 100
> m[2,2] # 矩阵的选择与向量类似 第一个为行第二个为列
[1] 12
> m[2,] # 不写默认选择所有,Python中需写:
[1] 2 12 22 32 42 52 62 72 82 92
> m[1:3,c(3,5,7)] # 选择框内是向量,或者判断的真值
[,1] [,2] [,3]
[1,] 21 41 61
[2,] 22 42 62
[3,] 23 43 63
数组的创建
z = array(1:24, c(2,3,4), dimnames = list(c('a1','a2'),c('b1','b2','b3'),paste0('c',1:4)))
> z
, , c1
b1 b2 b3
a1 1 3 5
a2 2 4 6
, , c2
b1 b2 b3
a1 7 9 11
a2 8 10 12
, , c3
b1 b2 b3
a1 13 15 17
a2 14 16 18
, , c4
b1 b2 b3
a1 19 21 23
a2 20 22 24
数组和矩阵中只能是数字,数字可以是多维
数据框
数据框是简单数据分析较常用的格式
> data.frame(a,b)
a b
1 1.0 1
2 2.3 2
3 4.0 3
4 1.0 4
5 2.3 5
6 4.0 4
> df <- data.frame(a,b)
> dim(df) # 类似于Python的shape函数
[1] 6 2
> rownames(df)
[1] "1" "2" "3" "4" "5" "6"
> nrow(df)
[1] 6
数据框的选择与前面类似,df[1:3]为1到3列,而Python中表示1到3行,R语言中$可以选择子集,类似于Python的df.a
> df$a
[1] 1.0 2.3 4.0 1.0 2.3 4.0
> df[df['b']>3,]$a # b列大于3的a数值
[1] 1.0 2.3 4.0
na.omit(df) # 去除有空值的行
> a <- c(1,2,3)
> b <- c(4,5,6,7)
> rbind(a,b)
[,1] [,2] [,3] [,4]
a 1 2 3 1
b 4 5 6 7
Warning message:
In rbind(a, b) :
number of columns of result is not a multiple of vector length (arg 1)
> cbind(a,b)
a b
[1,] 1 4
[2,] 2 5
[3,] 3 6
[4,] 1 7
Warning message:
In cbind(a, b) :
number of rows of result is not a multiple of vector length (arg 1)
遇到长度不一致,缺失循环自动补齐
merge函数可以根据同一个列索引合并两个数据框
对行和列处理时可以用apply函数
==apply(X, MARGIN, FUN, …) ==
其中X是数据框/矩阵名;
MARGIN为1表示取行,为2表示取列,
FUN是函数
函数
函数结构与大多数语言类似可以设置实参形参
myf <- function(x,y=3){
z=x+y
z}
有返回值可以直接返回,或使用return()
控制流
循环
for (var in seq){statement}
while(cond){statement}
条件语句
If (cond) {}else{}
Ifelse(cond,a,b)#二元的简化写法
switch
数据填写&文件读取
edit()可以通过键盘编辑数据或fix()
read.table(file, header=logical, sep=',', row.names) # 可以读取文本文件csv文件可以直接read.csv
xls表格
Library(RODBC)
Channel = odbcConnectExcel('file.xls)
Df = sqlFetch(Channel, 'sheet')
adbcClose(Channel)
xlsx表格
Library(xlsx)
Df=read.xlsx(file.xlsx, 1) # 数字为第几个工作表
R 中还有一个包,rio包,可以读取大多数文件函数也简单
Library(rio)
Channel = import('file.xlsx)
export(Channel, 'ex_file.xlsx')
export(Channel, 'ex_file.csv')
# 也可以在表中加新表
export(Channel, 'ex_file.xlsx', which='sheet2')