R语言基础
R语言基础
wwb 2016年7月25日保存
- 获取R和Rstudio
R的获取地址 cran.r-project.org
Rstudio的获取地址 www.rstudio.com
Rstudio 是R的用户接口,集成开发环境(IDE)
- 包(package) 集成众多函数
install.packages()
install_github()
- 获取帮助
忘了函数怎么用的可以这样
?lm 然后就会出现帮助 有的甚至有使用的例子
本文有些函数有例子,有的没有,主要需要自己实际操作,尝试。
- 向量(vector)
- 向量的创建、赋值
x <- vector("character",length = 10) 创建一个长度为10,类型为char的向量 x1 <- 1:4 数字1到4 x2 <- c(1,2,3,4) 同上 x3 <- c("a","b","c") 字符a b c names(x1) <- c("a","b","c","d") 给x1的元素命名 > x1 如果想要看变量的内容 直接敲变量名即可得到的结果 a b c d 1 2 3 4
注意:R语言中 赋值:x <- 1:4 中间必须有空格 符号: 小于号< 减号-
y-x 做计算中间不能加空格
TRUE FALSE 要大写
数组下标是从1开始的
- 矩阵(matrix)
向量+维度属性(整数向量:nrow,ncol) 维度为2
- 矩阵的创建,赋值
x <- matrix(nrow = 3,ncol = 2) 3行2列 x1 <- matrix(1:6,nrow = 3,ncol = 2) 3行2列 赋值先列后行 [,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 > dimnames(x1) <- list(c("a","b","c"),c("d","e")) > x1 d e a 1 4 b 2 5 c 3 6 dim(x) 查看矩阵的维度 dim(y) <- c(2,3) 给y这个变量赋予2行3列的维度 vector()+dim() 也能创建一个矩阵 attributes(x) 查看矩阵的属性 rbind(y1,y2) 按行拼接 直接接到上个矩阵下面 cbind(y1,y2) 按列拼接 接到右边
- 一些操作的基本方法
[] 提取一个或多个类型相同的元素 (框框中可以打条件,例如x>5)
[[]] 从列表或数据框中提取元素
$ 按名字从列表或数据框中提取元素
- 关于矩阵的简单操作
> x [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 > x[1,2] 查看第一行第二列 [1] 3 > x[1,] 查看第一行 [1] 1 3 5 > x[,2] 查看第二列 [1] 3 4 > x[1,c(2,3)] 查看第一行的第二三列 [1] 3 5 > x[1,c(2,3), drop = FALSE] 把 返回向量 改成 返回矩阵 [,1] [,2] [1,] 3 5
- 数组(array)
维度可以大于2
- 数组的创建
> x <- array(1:24,dim = c(4,6)) 2维 > x 得到的结果 [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 5 9 13 17 21 [2,] 2 6 10 14 18 22 [3,] 3 7 11 15 19 23 [4,] 4 8 12 16 20 24 > x <- array(1:24,dim = c(4,6,3)) 3维 > x , , 1 第3维的第一个元素 [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 5 9 13 17 21 [2,] 2 6 10 14 18 22 [3,] 3 7 11 15 19 23 [4,] 4 8 12 16 20 24 , , 2 [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 5 9 13 17 21 [2,] 2 6 10 14 18 22 [3,] 3 7 11 15 19 23 [4,] 4 8 12 16 20 24 , , 3 [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 5 9 13 17 21 [2,] 2 6 10 14 18 22 [3,] 3 7 11 15 19 23 [4,] 4 8 12 16 20 24
- 列表(list)
可以包含不同类型的对象
- 创建列表
> l <- list(a=c(1,2,3,4),b=matrix(1:6,nrow = 3,ncol = 2),c=c(9,10,11,12)) > l $a 第一个元素的名称 [1] 1 2 3 4 第一个元素的内容 $b [,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 $c [1] 9 10 11 12 > l$a 就可以查看a的内容
- 关于列表的简单操作
获取名字和内容: []
获取内容:[[]] / $
有嵌套的:[[]][] [[]][[]]
- 数据框(data frame)
储存表格数据(tabular data)
视为各元素长度相同的列表
- 每个元素代表一列数据
- 每个元素的长度代表行数
- 元素类型可以不同
数据框的创建
> df <- data.frame(id = c(1,2,3,4),name = c("a","b","c","d"),gender = c(TRUE,TRUE,FALSE,FALSE)) > df id name gender 1 1 a TRUE 2 2 b TRUE 3 3 c FALSE 4 4 d FALSE
- 关于数据框的简单操作
> z v1 v2 v3 1 1 6 11 2 2 7 12 3 3 8 13 4 4 9 14 5 5 10 15 > z[2,] 第二条记录 v1 v2 v3 2 2 7 12 > z[,2] 第二列 [1] 6 7 8 9 10 > z[,"v2"] 打第二列的名字也可以 [1] 6 7 8 9 10 > z[,"v2", drop = FALSE] 改成返回数据框而不是向量 v2 1 6 2 7 3 8 4 9 5 10 > z[z$v1>2,] 加判断条件 v1 v2 v3 3 3 8 13 4 4 9 14 5 5 10 15
- 因子(factor)
用于处理分类数据(有序/无序) ps 能不能比大小 比如 一年级 二年级 三年级 /男 女
整数向量+标签(label)
- 因子的创建
> x <- factor(c("female","female","male"),levels = c("male","female")) > x [1] female female male Levels: male female 在前面的是基线水平 > table(x) x male female 1 2 一个男性 两个女性 > unclass(x) 去掉label 看因子内容 [1] 2 2 1 attr(,"levels") [1] "male" "female" 原本的levels gl(3,5) 3是水平个数,5是每个水平的元素
- 缺失值(missing value)
NA(各种类型的缺失值) 和 NaN(数字的缺失值) NaN属于NA,NA不属于NaN
NA有类型属性 integer 或 character 等
is.na() 用于判断是否存在NA缺失值 (NaN缺失值会被判定为TRUE,即NA包含NaN) is.nan() 是否存在NaN缺失值 complete.cases(x,y) 对比两个变量对应位置上是否都不是缺失值 g <- complete.cases(airquality) 看每次记录中是否有缺失值,TRUE没有,FALSE有缺失值 airquality[g,] 拿出没有缺失值的记录
- 日期与时间
日期
date() / Sys.Date() /
weekdays() / months() / quarters()
> x1 <- date() > x1 [1] "Wed May 18 10:53:01 2016" > class(x1) 查看x1类型 [1] "character" > x2 <- Sys.Date() > x2 [1] "2016-05-18" > class(x2) [1] "Date" > x3 <- as.Date("2015-02-04") 强制类型转换 > x3 [1] "2015-02-04" > class(x3) [1] "Date" > weekdays(x3) 查看那天是星期几 [1] "星期三" 用的中文版似乎是显示中文 > months(x3) 查看月份 [1] "二月" > quarters(x3) 查看季度 [1] "Q1" > julian.Date(x3,origin = as.Date("2014-02-04")) 距离某天有多少天 [1] 365 attr(,"origin") [1] "2014-02-04" > x4 <- as.Date("2016-02-04") 这个日期格式是固定的 > x4-x3 日期可以做加减 Time difference of 365 days > as.numeric(x4-x3) 强制类型转换 换成数字 [1] 365
时间
Sys.time()
类型
- POSIXct 整数,常用于存入数据框
- POSIXlt 列表,还包含星期、年、月、日等信息
> x <- Sys.time() > x [1] "2016-05-18 11:12:59 CST" CST是时区
转换
> x <- "一月 1, 2015 02:33" 由于是中文版 月份星期就打中文 > strptime(x,"%B %d, %Y %H:%M") 传入的第一个变量是要传入的变量,第二个是对该变量的描述 [1] "2015-01-01 02:33:00 CST" 转换后返回值是这样的 > class(x) [1] "character" > x <- strptime(x,"%B %d, %Y %H:%M") 转换后赋值给x > class(x) [1] "POSIXlt" "POSIXt" 转换过来了
- 向量化操作
> x <- 1:5 > y <- 6:10 > x+y 向量对应位置相加减乘除 [1] 7 9 11 13 15 > x*y [1] 6 14 24 36 50
> x <- matrix(1:4,nrow = 2,ncol = 2) > y <- matrix(rep(2,4),nrow = 2,ncol = 2) > x+y [,1] [,2] [1,] 3 5 [2,] 4 6 > x*y 矩阵对应位置相乘 [,1] [,2] [1,] 2 6 [2,] 4 8 > x %*% y 矩阵乘法 [,1] [,2] [1,] 8 8 [2,] 12 12
- 查看数据的一些信息 (summarize data)
head(x,10) 看头10行 tail(x) 看尾几行,默认6行 summar(x) 每个变量的一些统计数据 str(x) 看有哪些指针 table(x) 总结,做成表格,看频率 加参数useNA = "ifany" 看NA有多少个 table(x,y) 出二维表 is.na(x) 看是否有缺失值 any() 判断 sum() 求和 all(条件) 判断是否所有都符合条件 dim(x) 查看数据维度 xtabs(Freq ~ Class + Age, data = x) 其中Class和Age是x中的变量,看两者的交叉频率 ftable(x) 扁平化表格
- 循环
for / while
for (n in x) {循环体}
x <- c(1,1) 以for循环计算30个Fibonacci数 for (i in 3:30) { x <- x[i-1]+x[i-2] }
while (条件) {循环体}
x <- c(1,1) 以while循环来计算30个Fibonacci数 i <- 3 while (i <= 30) { x <- x[i-1]+x[i-2] i <- i +1 }
if (conditon) {expr1} else {expr2}
x <- 1:100 找出100以内的质数 y <- rep(T,100) for (i in 3:100) { if (all(i%%(2:(i-1))!=0)){ y <- TRUE } else {y <- FALSE } } print(x[y])
lapply
可以循环处理列表中的每一个元素
lapply(列表,函数/函数名,其他参数)
总是返回一个列表
创建函数 function()
apply
沿着数组的某一维度处理数据(将函数用于矩阵的行或列)
与for/while效率相同,只是简便
apply(数组,维度,函数/函数名)
rowSums(x) 行求和 rowMeans(x) 行求平均 colSums(x) 列求和
mapply
lapply的多元版本
mapply(函数/函数名,数据,函数相关的参数)
tapply
对向量子集进行操作
tapply(向量,因子/因子列表,函数/函数名)
有关因子的创建看前文
split
根据因子或因子列表将向量或其他对象分组
通常与lapply一起使用
split(向量/列表/数据框,因子/因子列表)
例 lapply(split(k,f),mean) 分组后求均值
sapply
简化输出,与lapply一样
- 排序
sort
对向量进行排序,返回排好的内容
sort(x) 默认升序,加参数 decreasing = TRUE 降序
order
返回排好序的内容的下标
可以有多个排序标准
order(x$v4,x$v2) 先按第一个排序,若一样就按第二个排序,默认升序,可以只有一个标准,要降序的话加参数 decreasing = TRUE
关于R不错的微信文章
如何高效地学好R?
使用R进行数据挖掘全攻略
运用R分析全唐诗与全宋词