R数据科学学习笔记R数据科学

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

2021-03-29  本文已影响0人  FTDdata

本文是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>

上一篇下一篇

猜你喜欢

热点阅读