美文网首页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)

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