R语言基础(1):常用方法
从Python到R
相比于Python,R语言在进行统计分析建模及可视化方面有明显优势,且很多算法提供了R版本但不一定有Python。而两种语言在数据处理分析等方面其实相像,因此可以通过类比熟悉一下R语言,以便快速上手R并完成一些工作。本文小结R语言基础,主要涉及
- 基本语法,数据类型
- 常用函数,流程控制(写循环)
- 文件读写及数据框的常规操作
目前我用Python最常用的有以下操作:
- 用列表或字典存数据;写for循环;创建DataFrame。
- 批量获取文件名;读写csv文件,获取表格字段信息等;行列筛选;分组聚合。
- 对DataFrame进行运算,apply函数应用。
R的基础语法和数据类型?在R中上述常规操作如何实现?
R基础
对象类型
R中的对象即是我们通常理解的变量
R的索引默认从1开始而非0
数值类型:TRUE/FLASE; integer; numric; complex; character; raw(二进制)
特殊:Inf(正无穷); -Inf; NaN(非数字); NA(缺失,不存在); NULL(空变量,元素存在但是没赋值)
- 向量/Vector,
c()
,相当于数组,其内元素的类型必须相同 - 列表/List,
list()
,类似于Python中的list但是包容性更强,可以同时包含多种不同类型的数据 - 矩阵/Matrix,
matrix()
,二维数组 - 数组/Array,
array()
- 因子/Factor,
factor()
,类别变量 - 数据框/Data Frame,
data.frame()
,表格数据,每列为一个向量,列名为name
运算
比较:用
==; !=
来比较整数/向量/字符串是否相等,用all.equal(a,b)
比较两个数字变量赋值:
<-; =
,都可以 无区别,个人习惯=,全局变量赋值<<-
逻辑向量:
& ! |
,与非或,根据向量生成逻辑向量any();all()
循环/流程控制
if else
1 | if(x>3) |
repeat
循环,结合next; break
1 | n=0;j=0 |
while
循环,直接用for
循环
1 | for(i in 1:5){} |
常用函数
查看信息
library(bfast)
: 导入三方包,此处为bfast
Rscript test.R
:运行脚本
ls()
:查看所有变量,ls(pattern=“ab”)可以正则匹配
rm(list=ls())
:删除所有变量
class(); mode(); typeof()
:查看变量/数值类型:
1 | x = array(1:24, dim=c(4,3,2)) |
length()
:计算向量长度
dim()
:返回多维向量的维度
names()
:对象命名, R中可以给每个对象赋予名称,类似于字典的键
unlist()
;将多维list展开成一维
options(digits=n)
:设置全局小数点显示位数
summary()
:汇总函数,输出向量最大最小值四分位数等信息,也可以作用与data.frame,每列的汇总信息
attribute/
查看对象的所有属性裂变
View()
以电子表格的形式查看data.frame
文件路径相关
R中支持正斜杠
/
或双反斜杠\\
path = getwd()
:返回当前工作路径
file.path("c","program files","R")
:拼接,类似于Python中的os.path.join()
files = dir(path ,pattern = "\\.csv$")
:返回路径下所有csv文件名
filenames = dir(path ,pattern = "\\.csv$", full.names = TRUE)
:返回文件名绝对路径
basename(file)
:文件名
path.expand("~")
:返回当前绝对"C:/Users/huangs/Documents"
创建”字典name”
1 | x = c(1:4) |
创建序列”range”
1:10
:创建一个1~10的序列
seq(); seq.int()
:相当于Python中的range()
seq_alone(x)
:创建一个和x一样长的,从1开始的序列
1 | seq(0, 1, length.out = 11) # 0.1~1.0 |
rep(1:5),3
:基于一个序列的重复构造新序列,有多个参数可选,可以自定义重复规则
runif(30,1, 50)
:服从标准/随机分布的30个数,random uniform seq
创建时间序列
有关R中的时间在另外的笔记中进行总结
seq.Date: Generate Regular Sequences of Dates。api
1 | ## first days of years |
seq.POSIXt: Generate Regular Sequences of Times。api
1 | ## first days of years |
apply运算
lapply(list(),f(x))
:"list apply"
,- 对list中的每一个元素依次计算
f()
,并返回一个新的list
- 对list中的每一个元素依次计算
vapply(list()/vector(), f(x), numeric(1))
:"vaetor apply"
:返回vector,但需要确保结果可用vector包装并指定返回的数据类型及长度eapply()
;遍历环境中的变量mapply()
:多参数apply,tapply
:类似group by,with(data, tapply(x1, x2, f()))
by, aggregate
library(plyr)
:指定输入输出形式的apply函数ddply()
; 输入输出为data.framellply()
;输入输出均为listlaply()
;输入list,输出array
CSV读写
数据加载:
load(file = "...rda")
csv读写:
1 | df = read.csv(path, header = TRUE,encoding = "UTF-8") |
异常捕获
trycatch
1 | tryCatch({ |
表格操作
R中的data.frame类似于Python的pandas dataframe ,用于表示表格型数据,应用十分灵活方便
行列选择
1 | # 创建 |
其他操作
1 | # 获取表格信息 |
新建csv并追加data.frame
1 | outfile = "../.*csv" |
拆分
groups = split(df, df$Quarter)
:返回的是dflist,通过索引访问,如groups[1]
拆分后遍历
1 | df <- data.frame( |
dplyr包
一个功能强大的数据处理包dplyr
安装:install.packages("tidyverse")
;install.packages("dplyr")
%>%
管道操作符,该符号的意思是将前者作为后者的输入参数进行传入
拆分group_split
Groupby分类汇总
参考1
操作实例
1 | df <- data.frame( |