R语言学习笔记
数据导入
写法1:“文件名称”,如果不写路径,是会在当前路径下读取,可用getwd()获取当前路径。可用setwd(“路径”)修改当前路径。
写法2:绝对路径\文件名称,比如“D: \…\test.xlsx”。
写法2:“clipboard”,利用复制,然后读取 【x <- import("clipboard", header = T)】
#读取txt数据
read.table("file.txt", header=T) #导入txt文本文件
#读取excel数据
library(readxl) #加载程序包,读取.xlsx数据
cjb <- read_excel("E:/R语言/R语言学习/data/cjb.xlsx") #读取数据
#读取.csv数据
df <- read.csv("产品销售记录表.csv",header=,row.name=,clo.name=,skip=)
header:是否使用数据文件的第一行作为列名
row.name:指定行名称,可设置为FALSE
clo.name:指定列名称,可设置为FALSE
skip:很多时候数据较为复杂是,可以指定是否跳过文件的前几行读取。
数据基本处理
is.na-判断空值 is.na(x) x:向量
test =c('Hello', 'World',NA, 1, 2, 3)
is.na(test)
test[! is.na(test)] #去除test中NA值
union-计算并集 union(x,y) x, y:向量
union(1:4,2:5)#示例
union(1:4,8:10) # union只可以处理俩个向量,那如何计算多个向量的并集呢
union(1:4,union(2:5,8:10)) # 这个例子是想强调:函数是可以叠加的,不同函数之间也是如此
intersect-计算交集 intersect(x,y) x, y:向量
intersect(1:4,2:5)
intersect(1:4,union(2:5,8:10)) #ips:先求并集,再求交集
setdiff-获取左向量的特有元素 setdiff(x,y) x, y:向量
setdiff(1:4,2:5) 结果 1
seq-生成数值型向量 seq(from,to,by=,length.out=)
from:起始数值 to:终止数值 by:序列间隔,默认为1 length.out:将from-to区间划分为多少份,可简化为len
seq(1,9,by=3) # 生成1到9,以3为间隔的序列
seq(1,9,len=4) #将1到9的序列,划分为4等份
sample-随机抽取向量 sample(x,size,replace=FALSE)
x:待随机抽取的向量 size:抽取的次数,默认抽取length(x)次 replace:是否重复抽样
sample(1:10,5,rep=T) # 从1:10序列中随机放回抽取5次
注意: 随机抽取意味着运行两次sample(1:10,5)得到的结果不一样
set.seed()可以重复随机结果
set.seed(1234) #括号里面的参数可以是任意数字,代表你设置的第几号种子,不参与运算,是个标记。
sample(1:10,5,rep=T)#重复两次结果一样
rep-重复向量 rep(x,each,times)
x:待重复的向量 each:每一个元素重复的次数 times:向量整体重复次数
rep(c(1, 2, 3),2) # 向量整体重复2次
rep(c(1, 2, 3),each=2) # 向量的每一个元素依次重复2次
rep(c(1, 2, 3),1:3) # 向量的每一个元素重复不同次数
rep(c(1, 2, 3),each=2, times=3) #向量每一个元素重复2次,总共重复3次
rev-反向排列向量 rev(x) x:待反向排列的向量
rev(1:4) #结果4321
table-频次统计 table(x) x:待统计向量
table(c(1,2,2,4,7,1,1)) #结果

sort-元素重排 sort(x, decreasing=FALSE)
x: 待重排向量 decreasing: 降序排列,默认FALSE
order-求元素顺序 order(x, decreasing=FALSE)
x: 待排序向量 decreasing: 降序排列,默认FALSE)
order(c('b','e','a')) # 返回排序的坐标值 结果 3 1 2
rank-求元素排名 rank(x) x: 待求排名的向量
rank(c('b','e','a')) # 返回元素的排名 结果 2 3 1
tolower/ toupper字符串小/大写转换 tolower(x) /toupper(x) x: 待转换字符串或字符串向量
sub-字符串替换 sub(pattern, replacement, x)
pattern:待替换原始字符串模式 replacement:待替换目标字符串 x: 待转换字符串或字符串向量
sub("a","A",c("abcda","adcba")) #只替换每次字符串的第1个匹配
gsub("a","A",c("abcda","adcba")) #替换所有匹配
sub('a$', 'A', c("abcda","adcba")) #只替换位于末尾的a
sub('b.*a','Box', c("abcda","adcba")) # 替换从b到a的字符
sub('b.','Box', c("abcda","adcba")) # 替换b和其后一位的字符
sub('b.+','Box', c("abcda","adcba")) # 替换从b之后的所有字符
sub('l.*l','AAAA','Hello World') #贪婪匹配:匹配尽可能多的字符
sub('l.*?l','AAAA','Hello World') #懒惰匹配:匹配最短的字串
substr 字符串截取 substr(x, start, stop)
x:待截取字符串或字符串向量 start:起始位置 stop:终止位置
substr('Hello World', 1, 4)#截取第一到第四个位置上的字符
strsplit 字符串切割 strsplit(x, split) x:待切割字符串或字符串向量 split:分隔符
strsplit("Hello World", ' ') # 返回列表形式
unlist(strsplit('Hello World', ' ')) #Tips: strsplit返回结果形式为列表,可以通过unlist函数将列表转化为向量
paste-字符串连接 paste(…,sep="",collapse=NULL)
...:一个或多个R对象 sep:元素分隔符 collapse:字符串分隔符
paste('Hello','World',sep=', ') #结果"Hello, World"
paste('Hello','World',1, 2, 3,sep='_!_ ') #结果"Hello_!_ World_!_ 1_!_ 2_!_ 3"
paste(c('Hello','World'),c(1, 2, 3),sep=', ') #结果 "Hello, 1" "World, 2" "Hello, 3"
paste(c('Hello','World'),c(1, 2, 3),sep=', ',collapse = '; ') #结果 "Hello, 1; World, 2; Hello, 3"
match-整词匹配 match(x,table) x:待查询值 table:匹配模板
match(c('Hi', 'Wor', 2, 1, 3),c('Hello', 'World', 1, 2, 3)) #结果 NA NA 4 3 5
#Tips: match返回值为table中匹配x值的位置,没有匹配上返回NA; %in% 类似match,但是返回值为逻辑值
c('Hi', 'Wor', 2, 1, 3) %in% c('Hello', 'World', 1, 2, 3) #结果FALSE FALSE TRUE TRUE TRUE
grep关键字搜索 grep(pattern, x) pattern:待搜索字符串模式 x: 待搜索字符串或字符串向量
grep('o',c('Hello', 'World', 1, 2, 3)) # 返回匹配上的位置 结果 1 2
grepl('o',c('Hello', 'World', 1, 2, 3)) # 返回逻辑值 结果 TRUE TRUE FALSE FALSE FALSE
Tips: match为整词匹配,grep为关键字匹配;match第一个参数可以是向量,grep第一个参数只能是字符;match不能使用正则,grep可以使用正则
na.omit 删除含有空值的行 na.omit(df) df:数据框
apply 数据框循环 apply相比较for循环,可以提高运算效率
apply(X, MARGIN, FUN...) X:数组、矩阵、数据框 MARGIN:1表示按行,2表示按列 FUN:调用函数
head(airquality) # airquality是R内置的示例数据集
apply(head(airquality), 1, mean) #按行计算均值
subset-数据框截取 subset可以根据自定义条件截取数据框子集 subset(x,...,select)
x: 数据框 ...: 条件选择,主要针对行操作 select: 条件选择,主要针对列操作
head(airquality) # airquality是R内置的示例数据集
head(subset(airquality,Temp > 80, select = c(Ozone,Temp))) #选择 Temp>80的行,并且只展示Ozone和Temp列
head(subset(airquality, Day == 1, select = -Temp)) #选择Day=1的行,并且删除Temp列
split-数据框拆分 split可以根据某一列(因子型)将数据框拆分为不同子集
split(x, f) x: 数据框 f: 因子型列表
head(iris) # iris为R内置数据集
class(iris$Species) # 查看数据类型 Species列为因子型
levels(iris$Species) # 查看Species的类别
split(iris,iris$Species) # iris数据框集按species拆分
class(split(iris,iris$Species)) # 拆分后的数据类型为列表
names(split(iris,iris$Species)) # 拆分后的列表名称
head(split(iris,iris$Species)[['versicolor']]) # 查看拆分后的versicolor子集
merge-数据框合并 merge可以根据列名合并两个不同的数据框
merge(x, y, by = intersect(names(x), names(y)), by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all)
x,y 要合并的两个数据集
by,用于连接两个数据集的列,intersect(a,b)值向量a,b的交集,names(x)指提取数据集x的列名
by = intersect(names(x), names(y)) 是获取数据集x,y的列名后,提取其公共列名,作为两个数据集的连接列, 当有多个公共列时,需用下标指出公共列,如names(x)[1],指定x数据集的第1列作为公共列
也可以直接写为 by = ‘公共列名’ ,前提是两个数据集中都有该列名,并且大小写完全一致,R语言区分大小写
by.x,by.y:指定依据哪些行合并数据框,默认值为相同列名的列 默认根据数据框列名自行判断
all,all.x,all.y:指定x和y的行是否应该全在输出文件 默认仅输出非空行
sort:by指定的列(即公共列)是否要排序
suffixes:指定除by外相同列名的后缀
incomparables:指定by中哪些单元不进行合并
df1 = data.frame(CustomerId = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3)), Taste=c(rep("Sweet", 3), rep("bitter", 3))); df1
df2 = data.frame(CustomerId = c(2, 4, 7), State = c(rep("Alabama", 2), rep("Ohio", 1)), Flavour=c(rep("Sweet", 3), rep("bitter", 3))); df2
df3 = data.frame(CustomerId = c(1, 4, 7), Product = c("Toaster","Alabama", "Ohio")); df3
merge(x=df1, y=df2) #默认根据 df1 、df2相同列 CustomerID进行合并
merge(x=df1, y=df3) #默认根据 df1、 df3相同列 CustomerID、Product进行合并
merge(df1, df3, by="CustomerId") #指定根据df1、df3相同列CustomerID进行合并
head(merge(df1, df2, by.x="Taste", by.y="Flavour")) #指定根据df1的Taste列、df2的Flavour列进行合并
merge(x=df1, y=df3, by="CustomerId", all=T) #指定根据df1、df3相同列CustomerID进行合并,输出所有内容
merge(x=df1, y=df3, by="CustomerId", all.x =T) #指定根据df1、df3相同列CustomerID进行合并,输出df1所有内容
merge(x=df1, y=df3, by="CustomerId", all.y = T) #指定根据df1、df3相同列CustomerID进行合并,输出df3所有内容
#Tips:
#is.na也可以判断数据框空值
is.na(merge(x=df1, y=df3, by="CustomerId", all.y = T))
#complete.cases可以判断数据框某一列是否全部为非空值
complete.cases(merge(x=df1, y=df3, by="CustomerId", all.y = T))
# na.omit可以删除空行
na.omit(merge(x=df1, y=df3, by="CustomerId", all.y = T))
aggregate(x, by, FUN, ..., simplify = TRUE, drop = TRUE)
aggregate函数应该是数据处理中常用到的函数,简单说有点类似sql语言中的group by,可以按照要求把数据打组聚合,然后对聚合以后的数据进行加和、求平均等各种操作。
#我们常用到的参数是:x, by, FUN。 x, 你想要计算的属性或者列。 by, 是一个list,可以指定一个或者多个列作为分组的基础。 FUN, 指定一个函数,用来计算,可以作用在所有分组的数据上面。