一.向量相关函数
is.na(x)
x:向量
> test =c('Hello', 'World',NA, 1, 2, 3)
> is.na(test)
[1] FALSE FALSE TRUE FALSE FALSE FALSE
>
> test[! is.na(test)] #去除test中NA值
[1] "Hello" "World" "1" "2" "3"
union(x,y)
x, y:向量
> union(1:4,2:5)
[1] 1 2 3 4 5
> union(1:4,8:10)
[1] 1 2 3 4 8 9 10
Tips:union
只可以处理俩个向量,那如何计算多个向量的并集呢?
> union(1:4,union(2:5,8:10))
[1] 1 2 3 4 5 8 9 10
这个例子是想强调:函数是可以叠加的,不同函数之间也是如此
intersect(x,y)
x, y:向量
> intersect(1:4,2:5)
[1] 2 3 4
> intersect(1:4,8:10)
integer(0) # 表示没有并集
Tips:先求并集,再求交集
> intersect(1:4,union(2:5,8:10))
[1] 2 3 4
setdiff(x,y)
x, y:向量
> setdiff(1:4,2:5)
[1] 1
> setdiff(1:4,8:10)
[1] 1 2 3 4
seq(from,to,by=,length.out=)
from:起始数值
to:终止数值
by:序列间隔,默认为1
length.out:将from-to区间划分为多少份,可简化为len
> seq(1,9,by=3) # 生成1到9,以3为间隔的序列
[1] 1 4 7
> seq(1,9,len=4) #将1到9的序列,划分为4等份
[1] 1.000000 3.666667 6.333333 9.000000
sample(x,size,replace=FALSE)
x:待随机抽取的向量
size:抽取的次数,默认抽取length(x)次
replace:是否重复抽样
> sample(1:10) # 从1:10序列中随机不放回抽取10次
[1] 2 9 3 4 7 1 5 6 8 10
> sample(1:10,5) # 从1:10序列中随机不放回抽取5次
[1] 8 2 6 4 5
> sample(1:10,5,rep=T) # 从1:10序列中随机放回抽取5次
[1] 2 4 8 10 5
注意:
随机抽取意味着运行两次sample(1:10,5)得到的结果不一样
set.seed()可以重复随机结果
请自行运行两次,每次都可以获得2 7 7 7 9
set.seed(1234)
sample(1:10,5,rep=T)
rep(x,each,times)
x:待重复的向量
each:每一个元素重复的次数
times:向量整体重复次数
> rep(c(1, 2, 3),2) # 向量整体重复2次
[1] 1 2 3 1 2 3
> rep(c(1, 2, 3),each=2) # 向量的每一个元素依次重复2次
[1] 1 1 2 2 3 3
> rep(c(1, 2, 3),1:3) # 向量的每一个元素重复不同次数
[1] 1 2 2 3 3 3
> rep(c(1, 2, 3),each=2, times=3) #向量每一个元素重复2次,总共重复3次
[1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3
rev(x)
x:待反向排列的向量
> rev(1:4)
[1] 4 3 2 1
> rev(c('a','b','c','d'))
[1] "d" "c" "b" "a"
table(x)
x:待统计向量
> table(c(1,2,2,4,7,1,1))
1 2 4 7
3 2 1 1
二.排序相关函数
sort(x, decreasing=FALSE)
x: 待重排向量
decreasing: 降序排列,默认FALSE
> sort(c(4,2,1,5,8,1,4))
[1] 1 1 2 4 4 5 8
> sort(c(4,2,1,5,8,1,4),decreasing = T)
[1] 8 5 4 4 2 1 1
> sort(c('b','e','a')) # 返回重新排序后的向量
[1] "a" "b" "e"
order(x, decreasing=FALSE)
x: 待排序向量
decreasing: 降序排列,默认FALSE
> order(c('b','e','a')) # 返回排序的坐标值
[1] 3 1 2
> order(c('b','e','a'),decreasing = T)
[1] 2 1 3
rank(x)
x: 待求排名的向量
> rank(c('b','e','a')) # 返回元素的排名
[1] 2 3 1
三.字符相关函数
tolower(x)
x: 待转换字符串或字符串向量
> tolower('Hello World')
[1] "hello world"
toupper(x)
x: 待转换字符串或字符串向量
> toupper('Hello World')
[1] "HELLO WORLD"
sub(pattern, replacement, x)
pattern:待替换原始字符串模式
replacement:待替换目标字符串
x: 待转换字符串或字符串向量
> sub("a","A",c("abcda","adcba")) #只替换每次字符串的第1个匹配
[1] "Abcda" "Adcba"
> gsub("a","A",c("abcda","adcba")) #替换所有匹配
[1] "AbcdA" "AdcbA"
> sub('a$', 'A', c("abcda","adcba")) #只替换位于末尾的a
[1] "abcdA" "adcbA"
> sub('b.*a','Box', c("abcda","adcba")) # 替换从b到a的字符
[1] "aBox" "adcBox"
> sub('b.','Box', c("abcda","adcba")) # 替换b和其后一位的字符
[1] "aBoxda" "adcBox"
> sub('b.+','Box', c("abcda","adcba")) # 替换从b之后的所有字符
[1] "aBox" "adcBox"
> sub('l.*l','AAAA','Hello World') #贪婪匹配:匹配尽可能多的字符
[1] "HeAAAAd"
> sub('l.*?l','AAAA','Hello World') #懒惰匹配:匹配最短的字串
[1] "HeAAAAo World"
pattern参数可以结合正则表达式进行通配
正则表达式语法规则:
. 除了换行以外的任意字符 ^ 放在句首,表示一行字符串的起始 $ 放在句尾,表示一行字符串的结束
*零个或者多个之前的字符
+一个或者多个之前的字符 ? 零个或者一个之前的字符
substr(x, start, stop)
x:待截取字符串或字符串向量
start:起始位置
stop:终止位置
> substr('Hello World', 1, 4)
[1] "Hell"
strsplit(x, split)
x:待切割字符串或字符串向量
split:分隔符
> strsplit("Hello World", ' ') #返回列表形式
[[1]]
[1] "Hello" "World"
Tips: strsplit返回结果形式为列表,可以通过unlist函数将列表转化为向量
> unlist(strsplit('Hello World', ' '))
[1] "Hello" "World"
paste(…,sep="",collapse=NULL)
...:一个或多个R对象
sep:元素分隔符
collapse:字符串分隔符
> paste('Hello','World',sep=', ')
[1] "Hello, World"
> paste('Hello','World',1, 2, 3,sep='_!_ ')
[1] "Hello_!_ World_!_ 1_!_ 2_!_ 3"
> paste(c('Hello','World'),c(1, 2, 3),sep=', ')
[1] "Hello, 1" "World, 2" "Hello, 3"
> paste(c('Hello','World'),c(1, 2, 3),sep=', ',collapse = '; ')
[1] "Hello, 1; World, 2; Hello, 3"
四.匹配相关函数
match(x,table)
x:待查询值
table:匹配模板
> match(c('Hi', 'Wor', 2, 1, 3),c('Hello', 'World', 1, 2, 3))
[1] 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)
[1] FALSE FALSE TRUE TRUE TRUE
grep(pattern, x)
pattern:待搜索字符串模式
x: 待搜索字符串或字符串向量
> grep('o',c('Hello', 'World', 1, 2, 3)) # 返回匹配上的位置
[1] 1 2
> grepl('o',c('Hello', 'World', 1, 2, 3)) # 返回逻辑值
[1] TRUE TRUE FALSE FALSE FALSE
Tips: match为整词匹配,grep为关键字匹配;match第一个参数可以是向量,grep第一个参数只能是字符;match不能使用正则,grep可以使用正则
五.数据框相关函数
na.omit(df)
df:数据框
> head(airquality) # airquality是R内置的示例数据集
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
> na.omit(head(airquality))
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
apply(X, MARGIN, FUN...)
X:数组、矩阵、数据框
MARGIN:1表示按行,2表示按列
FUN:调用函数
> head(airquality) # airquality是R内置的示例数据集
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
> apply(head(airquality), 1, mean)
1 2 3 4 5 6
51.90000 40.16667 42.60000 68.91667 NA NA
> apply(head(airquality), 2, mean)
Ozone Solar.R Wind Temp Month Day
NA NA 11.45000 66.16667 5.00000 3.50000
subset(x,...,select)
x: 数据框
...: 条件选择,主要针对行操作
select: 条件选择,主要针对列操作
> head(airquality) # airquality是R内置的示例数据集
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
> head(subset(airquality,Temp > 80, select = c(Ozone,Temp))) #选择 Temp>80的行,并且只展示Ozone和Temp列
Ozone Temp
29 45 81
35 NA 84
36 NA 85
38 29 82
39 NA 87
40 71 90
> head(subset(airquality, Day == 1, select = -Temp)) #选择Day=1的行,并且删除Temp列
Ozone Solar.R Wind Month Day
1 41 190 7.4 5 1
32 NA 286 8.6 6 1
62 135 269 4.1 7 1
93 39 83 6.9 8 1
124 96 167 6.9 9 1
split(x, f)
x: 数据框
f: 因子型列表
> head(iris) # iris为R内置
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
> class(iris$Species) # Species列为因子型
[1] "factor"
> levels(iris$Species) # 查看Species的类别
[1] "setosa" "versicolor" "virginica"
> class(split(iris,iris$Species)) # 拆分后的数据类型为列表
[1] "list"
> names(split(iris,iris$Species)) # 拆分后的列表名称
[1] "setosa" "versicolor" "virginica"
> head(split(iris,iris$Species)[['versicolor']]) # 查看拆分后的versicolor子集
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
51 7.0 3.2 4.7 1.4 versicolor
52 6.4 3.2 4.5 1.5 versicolor
53 6.9 3.1 4.9 1.5 versicolor
54 5.5 2.3 4.0 1.3 versicolor
55 6.5 2.8 4.6 1.5 versicolor
56 5.7 2.8 4.5 1.3 versicolor
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: 指定合并依据列,默认根据数据框列名自行判断
all: 指定输出方式,默认仅输出非空行
自定义数据框
> df1 = data.frame(CustomerId = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3)), Taste=c(rep("Sweet", 3), rep("bitter", 3))); df1
CustomerId Product Taste
1 1 Toaster Sweet
2 2 Toaster Sweet
3 3 Toaster Sweet
4 4 Radio bitter
5 5 Radio bitter
6 6 Radio bitter
> 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
CustomerId State Flavour
1 2 Alabama Sweet
2 4 Alabama Sweet
3 7 Ohio Sweet
4 2 Alabama bitter
5 4 Alabama bitter
6 7 Ohio bitter
> df3 = data.frame(CustomerId = c(1, 4, 7), Product = c("Toaster","Alabama", "Ohio")); df3
CustomerId Product
1 1 Toaster
2 4 Alabama
3 7 Ohio
> merge(x=df1, y=df2) #默认根据df1、df2相同列CustomerID进行合并
CustomerId Product Taste State Flavour
1 2 Toaster Sweet Alabama Sweet
2 2 Toaster Sweet Alabama bitter
3 4 Radio bitter Alabama Sweet
4 4 Radio bitter Alabama bitter
> merge(x=df1, y=df3) #默认根据df1、df3相同列CustomerID、Product进行合并
CustomerId Product Taste
1 1 Toaster Sweet
> merge(df1, df3, by="CustomerId") #指定根据df1、df3相同列CustomerID进行合并
CustomerId Product.x Taste Product.y
1 1 Toaster Sweet Toaster
2 4 Radio bitter Alabama
> head(merge(df1, df2, by.x="Taste", by.y="Flavour")) #指定根据df1的Taste列、df2的Flavour列进行合并
Taste CustomerId.x Product CustomerId.y State
1 bitter 4 Radio 2 Alabama
2 bitter 4 Radio 4 Alabama
3 bitter 4 Radio 7 Ohio
4 bitter 5 Radio 2 Alabama
5 bitter 5 Radio 4 Alabama
6 bitter 5 Radio 7 Ohio
> merge(x=df1, y=df3, by="CustomerId", all=T) #指定根据df1、df3相同列CustomerID进行合并,输出所有内容
CustomerId Product.x Taste Product.y
1 1 Toaster Sweet Toaster
2 2 Toaster Sweet
3 3 Toaster Sweet
4 4 Radio bitter Alabama
5 5 Radio bitter
6 6 Radio bitter
7 7 Ohio
> merge(x=df1, y=df3, by="CustomerId", all.x =T) #指定根据df1、df3相同列CustomerID进行合并,输出df1所有内容
CustomerId Product.x Taste Product.y
1 1 Toaster Sweet Toaster
2 2 Toaster Sweet
3 3 Toaster Sweet
4 4 Radio bitter Alabama
5 5 Radio bitter
6 6 Radio bitter
> merge(x=df1, y=df3, by="CustomerId", all.y = T) #指定根据df1、df3相同列CustomerID进行合并,输出df3所有内容
CustomerId Product.x Taste Product.y
1 1 Toaster Sweet Toaster
2 4 Radio bitter Alabama
3 7 Ohio
Tips:
is.na也可以判断数据框空值
> is.na(merge(x=df1, y=df3, by="CustomerId", all.y = T))
CustomerId Product.x Taste Product.y
[1,] FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE
[3,] FALSE TRUE TRUE FALSE
complete.cases可以判断数据框某一列是否全部为非空值
> complete.cases(merge(x=df1, y=df3, by="CustomerId", all.y = T))
[1] TRUE TRUE FALSE
na.omit可以删除空行
> na.omit(merge(x=df1, y=df3, by="CustomerId", all.y = T))
CustomerId Product.x Taste Product.y
1 1 Toaster Sweet Toaster
2 4 Radio bitter Alabama