使用数据拆分函数可以选取符合指定条件的数据,同时使用数据合并函数可以将拆分的数据进行再次合并
一、split()函数
split函数用于根据给定条件拆分数据
例如
使用split()函数,依据鸢尾花数据集中的Species种类拆分
> split(iris,iris$Species)
$setosa
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
$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
$virginica
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
101 6.3 3.3 6.0 2.5 virginica
102 5.8 2.7 5.1 1.9 virginica
103 7.1 3.0 5.9 2.1 virginica
104 6.3 2.9 5.6 1.8 virginica
由于split()函数返回列表,若对返回的列表应用lapply()函数,则可以分别计算不同鸢尾花种属下的Sepal.Length的平均值
> lapply(split(iris$Sepal.Length,iris$Species),mean)
$setosa
[1] 5.006
$versicolor
[1] 5.936
$virginica
[1] 6.588
二、subset()函数
Subset()与split()函数类似,也用于拆分函数,但它只返回符合条件的数据,不像split()返回带有拆分分组的数据全体
例如:
我们用subset()函数选取鸢尾花数据集种setosa品种的鸢尾花数据
> subset(iris,Species=="setosa")
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
同时,我们也可以利用逻辑运算符来添加筛选条件
> subset(iris,Species=="setosa"&Sepal.Length>5.0)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
11 5.4 3.7 1.5 0.2 setosa
15 5.8 4.0 1.2 0.2 setosa
在函数中使用select参数,可以选取或排除指定列
例如:
只选取鸢尾花数据集中Sepal.Width和Species两列
> subset(iris,select = c(Sepal.Length,Species))
Sepal.Length Species
1 5.1 setosa
2 4.9 setosa
3 4.7 setosa
4 4.6 setosa
如果要排除此两列,只需要在列名前加~即可
> subset(iris,select = -c(Sepal.Length,Species))
Sepal.Width Petal.Length Petal.Width
1 3.5 1.4 0.2
2 3.0 1.4 0.2
3 3.2 1.3 0.2
4 3.1 1.5 0.2
三、数据合并
我们使用merge()函数用于依据共同值合并两个数据框,它类似于数据库中的链接操作
例如
我们以下列数据为例子,以name为基准,合并数学和英语成绩
> x<-data.frame(name=c("a","b","c"),math=c(1,2,3))
> y<-data.frame(name=c("c","b","a"),english=c(4,5,6))
> merge(x,y)
name math english
1 a 1 6
2 b 2 5
3 c 3 4
虽然name值保存的顺序不同,但是以共同的name值为基准,针对分数实现了很好的合并
使用merge()函数进行合并时,若共同值只在其中一方存在,而另一方无数据时,则相应的被排除在合并结果之外,但若将all设置为True,则缺失的数据会被填充为NA,所有数据行都会出现在结果中
例如
> x<-data.frame(name=c("a","b","c"),math=c(1,2,3))
> y<-data.frame(name=c("c","b","d"),english=c(4,5,6))
> merge(x,y)
name math english
1 b 2 5
2 c 3 4
> merge(x,y,all=TRUE)
name math english
1 a 1 NA
2 b 2 5
3 c 3 4
4 d NA 6