第四章:数据操作Ⅰ 第七节:数据拆分与合并

使用数据拆分函数可以选取符合指定条件的数据,同时使用数据合并函数可以将拆分的数据进行再次合并

一、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.WidthSpecies两列

> 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值