首页 > 解决方案 > 一种基于数据类型按顺序选择列的 R tidyverse 方法

问题描述

 library(tidyverse)
 #> Warning: package 'tidyverse' was built under R version 3.4.4
 #> Warning: package 'forcats' was built under R version 3.4.4

 example <- tibble(
     num1 = sample(1:100, 10),
     categ1 = as.factor(c(sample(letters, 10))),
     num2 = sample(1:100, 10),
     categ2 = as.factor(c(sample(letters, 10)))
 )

 head(example)
 #> # A tibble: 6 x 4
 #>    num1 categ1  num2 categ2
 #>   <int> <fct>  <int> <fct> 
 #> 1     4 c          5 l     
 #> 2    86 u         64 b     
 #> 3    38 z         18 r     
 #> 4    95 e         44 j     
 #> 5    77 w         35 u     
 #> 6    84 y         14 i

reprex 包(v0.2.0)于 2018 年 6 月 19 日创建。

上面的示例显示了具有整数和因子数据类型列的基本数据框。在这个小例子中,很容易使用select(example, categ1, categ2, num1, num2)in dplyr手动选择您希望列出现的顺序。

但是假设您有许多混合数据类型的列,并且您希望首先选择所有因素,然后再选择其他所有因素(或基于数据类型的任何特定顺序)?

手动输入每个列名或使用select()类似的助手可能contains()会很快变得乏味,因为有无数列。我更喜欢tidyverse解决方案,但也有兴趣如何在基础 R 中实现这一点。

标签: rdataframedplyr

解决方案


具有 3 个类别的列的示例数据

library(tidyverse)
example <- tibble(
     num1 = as.character(sample(1:100, 10)),
     categ1 = as.factor(c(sample(letters, 10))),
     num2 = sample(1:100, 10),
     categ2 = as.factor(c(sample(letters, 10)))
 )

假设您要按此顺序对列进行排序

my.order <- c('factor', 'integer', 'character')

即因子,然后是整数,然后是字符

你可以做

example %>% 
  select(sapply(., class) %>% .[order(match(., my.order))] %>% names)

# # A tibble: 10 x 4
#    categ1 categ2  num2 num1 
#    <fct>  <fct>  <int> <chr>
#  1 y      e         94 46   
#  2 t      b         52 31   
#  3 w      c         32 57   
#  4 k      i         27 89   
#  5 n      d         76 14   
#  6 x      g         67 40   
#  7 c      v         16 20   
#  8 e      z          6 95   
#  9 i      t         70 13   
# 10 g      w         57 42 

作为一个函数(相同的输出)

order_cols <- function(df, col.order){
  df %>% 
    select(sapply(., class) %>% .[order(match(., col.order))] %>% names)
}

example %>% 
  order_cols(c('factor', 'integer', 'character'))

推荐阅读