本文是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>
网友评论