R语言--高效操作数据框(dplyr包)(2)
2021-03-28 本文已影响0人
FTDdata
本文是R语言--高效操作数据框(dplyr包)系列的第二篇,介绍了列重命名、行筛选、行排序、行去重、数据合并等常见操作。
列重命名 rename
rename用来给列重命名,对于复杂情况的重命名特别有效。其中,全部列重命名采用基础方法names实现。
# 数据
tbl_df <- tibble(var1=1:4,var2=2:5,label=c("a","b","a","c"))
- 单个模式
# 引用方式
tbl_df %>% rename(new_var1=var1,new_var2=var2)
## # A tibble: 4 x 3
## new_var1 new_var2 label
## <int> <int> <chr>
## 1 1 2 a
## 2 2 3 b
## 3 3 4 a
## 4 4 5 c
# 位置方式
tbl_df %>% rename(new_var1=1,new_var2=2)
## # A tibble: 4 x 3
## new_var1 new_var2 label
## <int> <int> <chr>
## 1 1 2 a
## 2 2 3 b
## 3 3 4 a
## 4 4 5 c
- 批量模式
# 全部列
tbl_df %>% rename_all(paste,"new",sep="_")
## # A tibble: 4 x 3
## var1_new var2_new label_new
## <int> <int> <chr>
## 1 1 2 a
## 2 2 3 b
## 3 3 4 a
## 4 4 5 c
# 条件列
tbl_df %>% rename_if(is.character,paste,"new",sep="_")
## # A tibble: 4 x 3
## var1 var2 label_new
## <int> <int> <chr>
## 1 1 2 a
## 2 2 3 b
## 3 3 4 a
## 4 4 5 c
# 指定列
tbl_df %>% rename_at(c("var1","var2"),paste,"new",sep="_")
## # A tibble: 4 x 3
## var1_new var2_new label
## <int> <int> <chr>
## 1 1 2 a
## 2 2 3 b
## 3 3 4 a
## 4 4 5 c
# 基础方法全部列重命名
tbl_df %>% `names<-`(c("new_var1","new_var2","new_label"))
## # A tibble: 4 x 3
## new_var1 new_var2 new_label
## <int> <int> <chr>
## 1 1 2 a
## 2 2 3 b
## 3 3 4 a
## 4 4 5 c
行筛选 filter
filter函数用来对数据框行进行条件筛选,选择出数据框的子集。
# 数据
tbl_df <- tibble(var1=1:4,var2=2:5,var3=3:6)
- 单个模式
tbl_df %>% filter(var1>1) # 单条件
## # A tibble: 3 x 3
## var1 var2 var3
## <int> <int> <int>
## 1 2 3 4
## 2 3 4 5
## 3 4 5 6
tbl_df %>% filter(var1>1,var2<5) # 多条件
## # A tibble: 2 x 3
## var1 var2 var3
## <int> <int> <int>
## 1 2 3 4
## 2 3 4 5
tbl_df %>% filter(var1>1 & var2<5) # 多条件(逻辑运算符)
## # A tibble: 2 x 3
## var1 var2 var3
## <int> <int> <int>
## 1 2 3 4
## 2 3 4 5
tbl_df %>% filter(var1>mean(var1)) # 引用列
## # A tibble: 2 x 3
## var1 var2 var3
## <int> <int> <int>
## 1 3 4 5
## 2 4 5 6
var1 <- 3
tbl_df %>% filter(var1>!!var1) # 非引用列
## # A tibble: 1 x 3
## var1 var2 var3
## <int> <int> <int>
## 1 4 5 6
tbl_df %>% filter(row_number()==1) # 第一行
## # A tibble: 1 x 3
## var1 var2 var3
## <int> <int> <int>
## 1 1 2 3
tbl_df %>% filter(row_number()==n()) # 最后一行
## # A tibble: 1 x 3
## var1 var2 var3
## <int> <int> <int>
## 1 4 5 6
tbl_df %>% filter(between(row_number(),2,n())) # 第2到最后一行
## # A tibble: 3 x 3
## var1 var2 var3
## <int> <int> <int>
## 1 2 3 4
## 2 3 4 5
## 3 4 5 6
- 批量模式
# 全部列
tbl_df %>% filter_all(all_vars(.>1)) # 取交集(.代表任意列)
## # A tibble: 3 x 3
## var1 var2 var3
## <int> <int> <int>
## 1 2 3 4
## 2 3 4 5
## 3 4 5 6
tbl_df %>% filter_all(any_vars(.>1)) # 取并集
## # A tibble: 4 x 3
## var1 var2 var3
## <int> <int> <int>
## 1 1 2 3
## 2 2 3 4
## 3 3 4 5
## 4 4 5 6
# 条件列
tbl_df %>% filter_if(~min(.)>1,all_vars(.>3)) # 条件下取交集
## # A tibble: 2 x 3
## var1 var2 var3
## <int> <int> <int>
## 1 3 4 5
## 2 4 5 6
tbl_df %>% filter_if(~min(.)>1,~.>3) # 结果同上
## # A tibble: 2 x 3
## var1 var2 var3
## <int> <int> <int>
## 1 3 4 5
## 2 4 5 6
# 指定列
tbl_df %>% filter_at(c(1,2),all_vars(.>3)) # 指定列取交集
## # A tibble: 1 x 3
## var1 var2 var3
## <int> <int> <int>
## 1 4 5 6
行排序 arrange
arrange函数用来给数据框行排序。
# 数据
tbl_df <- tibble(var1=c(2,3,1,4),var2=2:5,label=c("a","b","a","c"))
- 单个模式
tbl_df %>% arrange(label) # 单列升序排序
## # A tibble: 4 x 3
## var1 var2 label
## <dbl> <int> <chr>
## 1 2 2 a
## 2 1 4 a
## 3 3 3 b
## 4 4 5 c
tbl_df %>% arrange(desc(label)) # 单列降序排序
## # A tibble: 4 x 3
## var1 var2 label
## <dbl> <int> <chr>
## 1 4 5 c
## 2 3 3 b
## 3 2 2 a
## 4 1 4 a
tbl_df %>% arrange(label,var1) # 多列组合排序(都升序)
## # A tibble: 4 x 3
## var1 var2 label
## <dbl> <int> <chr>
## 1 1 4 a
## 2 2 2 a
## 3 3 3 b
## 4 4 5 c
tbl_df %>% arrange(label,desc(var1)) # 多列组合排序(label升序,var1降序)
## # A tibble: 4 x 3
## var1 var2 label
## <dbl> <int> <chr>
## 1 2 2 a
## 2 1 4 a
## 3 3 3 b
## 4 4 5 c
- 批量模式
# 全部列
tbl_df %>% arrange_all() # 升序
## # A tibble: 4 x 3
## var1 var2 label
## <dbl> <int> <chr>
## 1 1 4 a
## 2 2 2 a
## 3 3 3 b
## 4 4 5 c
tbl_df %>% arrange_all(desc) # 降序
## # A tibble: 4 x 3
## var1 var2 label
## <dbl> <int> <chr>
## 1 4 5 c
## 2 3 3 b
## 3 2 2 a
## 4 1 4 a
# 条件列
tbl_df %>% arrange_if(is.character) # 升序
## # A tibble: 4 x 3
## var1 var2 label
## <dbl> <int> <chr>
## 1 2 2 a
## 2 1 4 a
## 3 3 3 b
## 4 4 5 c
tbl_df %>% arrange_if(is.character,desc) # 降序
## # A tibble: 4 x 3
## var1 var2 label
## <dbl> <int> <chr>
## 1 4 5 c
## 2 3 3 b
## 3 2 2 a
## 4 1 4 a
# 指定列
tbl_df %>% arrange_at(c(1,2)) # 升序
## # A tibble: 4 x 3
## var1 var2 label
## <dbl> <int> <chr>
## 1 1 4 a
## 2 2 2 a
## 3 3 3 b
## 4 4 5 c
tbl_df %>% arrange_at(c(1,2),desc) # 降序
## # A tibble: 4 x 3
## var1 var2 label
## <dbl> <int> <chr>
## 1 4 5 c
## 2 3 3 b
## 3 2 2 a
## 4 1 4 a
行去重 distinct
distince函数用来给数据框行去重。
# 数据
tbl_df <- tibble(var1=c(1,1,3,4,4),var2=c(2,2,7,8,7),label=c("a","a","b","c","a"))
- 单个模式
tbl_df %>% distinct() # 全部列整行去重
## # A tibble: 4 x 3
## var1 var2 label
## <dbl> <dbl> <chr>
## 1 1 2 a
## 2 3 7 b
## 3 4 8 c
## 4 4 7 a
tbl_df %>% distinct(label) # 单列去重(返回该列)
## # A tibble: 3 x 1
## label
## <chr>
## 1 a
## 2 b
## 3 c
tbl_df %>% distinct(var1,var2) # 多列去重(返回多列)
## # A tibble: 4 x 2
## var1 var2
## <dbl> <dbl>
## 1 1 2
## 2 3 7
## 3 4 8
## 4 4 7
tbl_df %>% distinct(label,.keep_all = TRUE) # 单列去重(返回所有列)
## # A tibble: 3 x 3
## var1 var2 label
## <dbl> <dbl> <chr>
## 1 1 2 a
## 2 3 7 b
## 3 4 8 c
tbl_df %>% distinct(var1,var2,.keep_all = TRUE) # 多列去重(返回所有列)
## # A tibble: 4 x 3
## var1 var2 label
## <dbl> <dbl> <chr>
## 1 1 2 a
## 2 3 7 b
## 3 4 8 c
## 4 4 7 a
tbl_df %>% distinct(diff=var2-var1,.keep_all = TRUE) # 运算后去重(返回所有列)
## # A tibble: 3 x 4
## var1 var2 label diff
## <dbl> <dbl> <chr> <dbl>
## 1 1 2 a 1
## 2 3 7 b 4
## 3 4 7 a 3
- 批量模式
# 全部列
tbl_df %>% distinct_all(rev) # 整行去重后转置
## # A tibble: 4 x 3
## var1 var2 label
## <dbl> <dbl> <chr>
## 1 4 7 a
## 2 4 8 c
## 3 3 7 b
## 4 1 2 a
# 条件列
tbl_df %>% distinct_if(is.numeric) # 数值列去重
## # A tibble: 4 x 2
## var1 var2
## <dbl> <dbl>
## 1 1 2
## 2 3 7
## 3 4 8
## 4 4 7
# 指定列
tbl_df %>% distinct_at(c(1,2)) # 指定列去重
## # A tibble: 4 x 2
## var1 var2
## <dbl> <dbl>
## 1 1 2
## 2 3 7
## 3 4 8
## 4 4 7
数据框合并 bind_rows/bind_cols
bind_rows和bind_cols函数用来合并数据框。
- 按行合并
# 数据框
df1 <- tibble(x=1:2,y=2:3)
df2 <- tibble(x=3:4,y=4:5)
# 向量
v1 <- c(x=1,y=2)
v2 <- c(x=3,y=4)
# 应用于数据框
bind_rows(df1,df2) # 单个合并
## # A tibble: 4 x 2
## x y
## <int> <int>
## 1 1 2
## 2 2 3
## 3 3 4
## 4 4 5
bind_rows(list(df1,df2)) # list合并
## # A tibble: 4 x 2
## x y
## <int> <int>
## 1 1 2
## 2 2 3
## 3 3 4
## 4 4 5
# 应用于向量
bind_rows(v1,v2) # 单个合并
## # A tibble: 2 x 2
## x y
## <dbl> <dbl>
## 1 1 2
## 2 3 4
bind_rows(!!!list(v1,v2)) # list合并
## # A tibble: 2 x 2
## x y
## <dbl> <dbl>
## 1 1 2
## 2 3 4
# 向量,数据框混合应用
bind_rows(v1,df1,v2)# 单个合并
## # A tibble: 4 x 2
## x y
## <dbl> <dbl>
## 1 1 2
## 2 1 2
## 3 2 3
## 4 3 4
bind_rows(!!!list(v1,df1,v2)) # list合并
## # A tibble: 4 x 2
## x y
## <dbl> <dbl>
## 1 1 2
## 2 1 2
## 3 2 3
## 4 3 4
# 增加分组名
bind_rows(df1,df2,.id = "group")
## # A tibble: 4 x 3
## group x y
## <chr> <int> <int>
## 1 1 1 2
## 2 1 2 3
## 3 2 3 4
## 4 2 4 5
- 按列合并
# 数据框
df1 <- tibble(x=1:2,y=2:3)
df2 <- tibble(a=3:4,b=4:5)
# 应用于数据框
bind_cols(df1,df2) # 枚举多个
## # A tibble: 2 x 4
## x y a b
## <int> <int> <int> <int>
## 1 1 2 3 4
## 2 2 3 4 5
bind_cols(list(df1,df2)) # 多个组成list
## # A tibble: 2 x 4
## x y a b
## <int> <int> <int> <int>
## 1 1 2 3 4
## 2 2 3 4 5