【上一篇:44.用学到的tidy data整理工具处理tidyr::who数据集】
【下一篇:46.关于Mutating joins类函数和merge函数】
彼此相关的数据在多张表中,这些相关的表就是关系型数据(relational data)。这是更实际的情况,所以我们需要一些可以处理关系型数据的函数。
用来处理关系型数据的函数有三大类:
1) Mutating joins:从另一个dataframe中根据匹配的observations为本dataframe添加新的变量。
2)Filtering joins:根据是否与另一个表中的observations匹配,从一个dataframe中过滤observation
3)Set operations:将observations视为集合操作。
前面学习到的来自nycflights13包的flight数据表还有其他四个关联数据表:airlines、airports、planes、weather。他们与flight数据表的关系是:flight通过carrier变量与airlines关联;通过origin、dest变量与airports关联;通过tailnum与planes关联;通过year、month、day、hour和origin与weather关联。
Keys是联系成对表格的变量,可以是一个,也可以是一组,这些变量唯一标识一个observation,也就是变量中的每个值唯一对应一个observation。如上述"flight通过carrier变量与airlines关联"中carrier就是一个key,"flights通过year、month、day、hour和origin与weather关联"中year、month、day、hour和origin是一组key。
有两种类型的Key:
1)primary key:在本表中唯一标识一个observation。例如planestailnum就是一个foreign key,因为它在flights表中,将每架航班匹配唯一的plane。一个变量可以是primary key,也可以是foreign key。
3)surrogate key:代理key,这种key的出现主要是因为有时候在table中找不到primary key,这时候就可以用mutate()或row_number()函数创建一个surrogate key。surrogate key 在你做完过滤后想在原始表中回溯原始数据的时候比较有用。
一个表格中的primary key可以用类似如下命令验证:
> library(nycflights13)
> library(tidyverse)
> planes %>% count(tailnum) %>% filter(n>1)
# A tibble: 0 x 2
# ... with 2 variables: tailnum <chr>, n <int>
表格中的primary key与另一个表格中的foreign key构成了一种关系,利用这种关系可以进行表格间的合并、过滤等。
row_number()是dplyr包中的ranking类函数。
row_number(x)
x:是用来rank的向量。其中的NA会原样输出,如果需要将NA放在最大或最小的位置,需要先将其转成Inf或-Inf。
> x <- c(5, 1, 3, 2, 2, NA)
> row_number(x)
[1] 5 1 4 2 3 NA
总结一下:举个例子,你有两个表格table1和table2,table1中是班级中每个人(人名所在列名为name)的性别(没有重名的人)、各科成绩等信息,table2中是全班所有人的家庭住址(人名所在列名为Name)。你的需求是从table2中获取学生的家庭住址并添加到table1中。那么,对table1来说name就是primary key,对应table2中的Name就是foreign key,你需要根据name和Name的对应关系将table2中住址列贴到table1中。你的另一个需求是提取table1中住在XX小区的学生的信息,那么,你需要先根据table2找出住在XX小区的学生,然后从table1中筛选出结果。
后续的内容就是学习一些函数来解决以上两个需求的,详见下篇。
【上一篇:44.用学到的tidy data整理工具处理tidyr::who数据集】
【下一篇:46.关于Mutating joins类函数和merge函数】
网友评论