美文网首页R数据科学学习笔记R数据科学
R语言--高效操作数据框(dplyr包)(3)

R语言--高效操作数据框(dplyr包)(3)

作者: FTDdata | 来源:发表于2021-03-29 08:44 被阅读0次

本文是R语言--高效操作数据框(dplyr包)系列的第三篇,主要介绍了数据框连接操作、数据框集合操作和数据框的分组计算等常见数据操作。

数据框连接 join

join系列函数用来连接两个数据框。

# 数据框
df1 <- tibble(id=1:2,v1=c("a1","a2"))
df2 <- tibble(id=2:4,v2=c("b1","b2","b3"))

# 内连接
inner_join(df1,df2)
## # A tibble: 1 x 3
##      id v1    v2   
##   <int> <chr> <chr>
## 1     2 a2    b1
# 左连接
left_join(df1,df2)
## # A tibble: 2 x 3
##      id v1    v2   
##   <int> <chr> <chr>
## 1     1 a1    <NA> 
## 2     2 a2    b1
# 右连接
right_join(df1,df2)
## # A tibble: 3 x 3
##      id v1    v2   
##   <int> <chr> <chr>
## 1     2 a2    b1   
## 2     3 <NA>  b2   
## 3     4 <NA>  b3
# 全连接
full_join(df1,df2)
## # A tibble: 4 x 3
##      id v1    v2   
##   <int> <chr> <chr>
## 1     1 a1    <NA> 
## 2     2 a2    b1   
## 3     3 <NA>  b2   
## 4     4 <NA>  b3
# 过滤左连接
semi_join(df1,df2) # 保留连接部分
## # A tibble: 1 x 2
##      id v1   
##   <int> <chr>
## 1     2 a2
anti_join(df1,df2) # 删除连接部分
## # A tibble: 1 x 2
##      id v1   
##   <int> <chr>
## 1     1 a1
# 列表连接
nest_join(df1,df2)
## # A tibble: 2 x 3
##      id v1    df2             
## * <int> <chr> <list>          
## 1     1 a1    <tibble [0 × 1]>
## 2     2 a2    <tibble [1 × 1]>
nest_join(df1,df2) %>% tidyr::unnest(cols = 3) # 转为内连接
## # A tibble: 1 x 3
##      id v1    v2   
##   <int> <chr> <chr>
## 1     2 a2    b1
# 指定列名连接
# 有相同列
inner_join(df1,df2,by="id") # 可消除提示消息
## # A tibble: 1 x 3
##      id v1    v2   
##   <int> <chr> <chr>
## 1     2 a2    b1
# 无相同列
df3 <- tibble(index=2:4,v2=c("b1","b2","b3"))
inner_join(df1,df3,by=c("id"="index"))
## # A tibble: 1 x 3
##      id v1    v2   
##   <int> <chr> <chr>
## 1     2 a2    b1

数据框集合操作 intersect/union/setdiff

计算两个数据框的交集、并集、补集。

# 数据框
tbl_df1 <- tibble(var1=1:3,var2=5:7)
tbl_df2 <- tibble(var1=2:4,var2=6:8)
# 求交集
intersect(tbl_df1,tbl_df2) 
## # A tibble: 2 x 2
##    var1  var2
##   <int> <int>
## 1     2     6
## 2     3     7
# 求并集
union(tbl_df1,tbl_df2) 
## # A tibble: 4 x 2
##    var1  var2
##   <int> <int>
## 1     1     5
## 2     2     6
## 3     3     7
## 4     4     8
# 求并集(不删除交集部分)
union_all(tbl_df1,tbl_df2) 
## # A tibble: 6 x 2
##    var1  var2
##   <int> <int>
## 1     1     5
## 2     2     6
## 3     3     7
## 4     2     6
## 5     3     7
## 6     4     8
# 求补集(tbl_df1的补集)
setdiff(tbl_df1,tbl_df2) 
## # A tibble: 1 x 2
##    var1  var2
##   <int> <int>
## 1     1     5
# 判断量数据框是否相同 TRUE
setequal(tbl_df1,tbl_df1[3:1,]) 
## [1] TRUE

数据分组计算 group_by+summarise

数据框按标签列分组计算是数据分析中的常见场景。group_by+sumarise函数的组合可以很灵活的完成各种分组计算的需求。

单函数应用单列

单个函数应用于分组数据的单个列进行计算。可以在summarise中直接指定新的计算列名。

# 数据
tbl_df <- tibble(var1=1:4,var2=2:5,var3=3:6,label=c("a","b","a","b"))
# 普通方式
tbl_df %>% 
  group_by(label) %>% 
  summarise(mean=mean(var1)) # 计算列指定列名
## # A tibble: 2 x 2
##   label  mean
##   <chr> <dbl>
## 1 a         2
## 2 b         3

单函数应用多列

单个函数应用于分组数据的多个列,进行批量计算。当采用summarise_at、summarize_all、summarise_if函数时,如果需要对计算列进行重命名,计算函数需要采用list的形式,且计算列名的模式会是原有列名+后缀的形式。

# 普通方式
tbl_df %>% 
  group_by(label) %>% 
  summarise(mean1=mean(var1),mean2=mean(var2)) # 计算列指定列名
## # A tibble: 2 x 3
##   label mean1 mean2
##   <chr> <dbl> <dbl>
## 1 a         2     3
## 2 b         3     4
# 指定多列(计算列无列名)
tbl_df %>% 
  group_by(label) %>% 
  summarise_at(c("var1","var2"),mean) 
## # A tibble: 2 x 3
##   label  var1  var2
##   <chr> <dbl> <dbl>
## 1 a         2     3
## 2 b         3     4
# 指定多列(计算列重命名)
tbl_df %>% 
  group_by(label) %>% 
  summarise_at(c("var1","var2"),list(mean=mean))
## # A tibble: 2 x 3
##   label var1_mean var2_mean
##   <chr>     <dbl>     <dbl>
## 1 a             2         3
## 2 b             3         4
# 所有列
tbl_df %>% 
  group_by(label) %>% 
  summarise_all(list(mean=~mean(.,na.rm = T))) # 计算列重命名+匿名函数
## # A tibble: 2 x 4
##   label var1_mean var2_mean var3_mean
##   <chr>     <dbl>     <dbl>     <dbl>
## 1 a             2         3         4
## 2 b             3         4         5
# 条件列
tbl_df %>% 
  group_by(label) %>% 
  summarise_if(is.numeric,list(mean=mean))
## # A tibble: 2 x 4
##   label var1_mean var2_mean var3_mean
##   <chr>     <dbl>     <dbl>     <dbl>
## 1 a             2         3         4
## 2 b             3         4         5

多函数应用于单列

多个不同的函数应用于分组数据的同一列。

# 普通方式
tbl_df %>% 
  group_by(label) %>% 
  summarise(mean=mean(var1),max=max(var1)) # 计算列指定列名
## # A tibble: 2 x 3
##   label  mean   max
##   <chr> <dbl> <int>
## 1 a         2     3
## 2 b         3     4
# 指定列方式(计算列无列名)
tbl_df %>% 
  group_by(label) %>% 
  summarise_at("var1",list(mean,max)) 
## # A tibble: 2 x 3
##   label   fn1   fn2
##   <chr> <dbl> <int>
## 1 a         2     3
## 2 b         3     4
# 指定列方式(计算列重命名)
tbl_df %>% 
  group_by(label) %>% 
  summarise_at("var1",list(mean=~mean(.),max=~max(.))) 
## # A tibble: 2 x 3
##   label  mean   max
##   <chr> <dbl> <int>
## 1 a         2     3
## 2 b         3     4

多函数应用于多列

多个函数应用于分组数据的多列,即每列都进行相同的多个函数计算。

# 普通方式
tbl_df %>% 
  group_by(label) %>% 
  summarise(mean1=mean(var1),max1=max(var1),mean2=mean(var2),max2=max(var2)) 
## # A tibble: 2 x 5
##   label mean1  max1 mean2  max2
##   <chr> <dbl> <int> <dbl> <int>
## 1 a         2     3     3     4
## 2 b         3     4     4     5
#  指定列方式(计算列无列名)
tbl_df %>% 
  group_by(label) %>% 
  summarise_at(c("var1","var2"),list(mean,max)) 
## # A tibble: 2 x 5
##   label var1_fn1 var2_fn1 var1_fn2 var2_fn2
##   <chr>    <dbl>    <dbl>    <int>    <int>
## 1 a            2        3        3        4
## 2 b            3        4        4        5
# 指定列方式(计算列重命名)
tbl_df %>% 
  group_by(label) %>% 
  summarise_at(c("var1","var2"),list(mean=~mean(.),max=~max(.))) 
## # A tibble: 2 x 5
##   label var1_mean var2_mean var1_max var2_max
##   <chr>     <dbl>     <dbl>    <int>    <int>
## 1 a             2         3        3        4
## 2 b             3         4        4        5
#  所有列
tbl_df %>% 
  group_by(label) %>% 
  summarise_all(list(mean=~mean(.),max=~max(.)))
## # A tibble: 2 x 7
##   label var1_mean var2_mean var3_mean var1_max var2_max
##   <chr>     <dbl>     <dbl>     <dbl>    <int>    <int>
## 1 a             2         3         4        3        4
## 2 b             3         4         5        4        5
## # … with 1 more variable: var3_max <int>
#  条件列
tbl_df %>% 
  group_by(label) %>% 
  summarise_if(is.numeric,list(mean=~mean(.),max=~max(.)))
## # A tibble: 2 x 7
##   label var1_mean var2_mean var3_mean var1_max var2_max
##   <chr>     <dbl>     <dbl>     <dbl>    <int>    <int>
## 1 a             2         3         4        3        4
## 2 b             3         4         5        4        5
## # … with 1 more variable: var3_max <int>

相关文章

  • R语言--高效操作数据框(dplyr包)(3)

    本文是R语言--高效操作数据框(dplyr包)系列的第三篇,主要介绍了数据框连接操作、数据框集合操作和数据框的分组...

  • R语言--高效操作数据框(dplyr包)(2)

    本文是R语言--高效操作数据框(dplyr包)系列的第二篇,介绍了列重命名、行筛选、行排序、行去重、数据合并等常见...

  • dplyr包常用函数操作

    R语言中的有一个数据处理的强大的包,它就是 dplyr 包,dplyr包 像操作数据库一样操作 R,方便,轻松,快...

  • 用dplyr包进行数据清理-mutate()和arrange()

    笔记说明 dplyr包是一个用于数据清理的高效r包,也是tidyverse的核心包之一。dplyr包的常用操作包括...

  • 在spark 使用dplyr 对数据进行操作

    概论 dplyr是一个用于处理R内外结构化数据的R包.dplyr使R用户的数据操作变得简单,一致和高效。使用dpl...

  • dplyr包

    1. dplyr简介 dplyr是R语言的数据分析包,能对dataframe类型的数据做很方便的数据处理和分析操作...

  • R语言--高效操作数据框(dplyr包)(1)

    数据框是R语言中的一个重要数据结构,在数据分析过程中,主要的数据对象就是数据框。R语言内置了data.frame类...

  • dplyr包笔记

    dplyr包是R语言数据处理的神器,这里记录一点刚学到的东西。 以下操作基于R语言自带数据集"mtcars". 变...

  • 【r<-基础】R-数据操作(一)

    本文内容:基础函数操作数据框sqldf包使用SQL查询数据框data.table包操作数据dplyr管道操作处理数...

  • dplyr 数据处理

    dplyr 是plyr的增强版,名称中的d表名了它是一个专注于处理数据框的R包,dplyr提供了灵活的数据操作语法...

网友评论

    本文标题:R语言--高效操作数据框(dplyr包)(3)

    本文链接:https://www.haomeiwen.com/subject/lgnlhltx.html