【问题标题】:dplyr::select() to reorder columns which may not existdplyr::select() 对可能不存在的列重新排序
【发布时间】:2020-07-28 09:57:33
【问题描述】:

在 dplyr 中,如何根据包含在 tibble 中可能存在或不存在的变量的列名称的字符向量对 tibble 的列重新排序?

我试过select_if(names(.) %in% col_vector),但这并没有对列重新排序。

例子:

set.seed(1)
col_order <- c("a", "b", "c", "d", "e")
tibby <- tibble(d = rnorm(10), b = runif(10), a = rnorm(10))

select_if(tibby, names(tibby) %in% col_order)
# A tibble: 10 x 3
#        d      b       a
#    <dbl>  <dbl>   <dbl>
# 1 -0.626 0.935  -0.0449
# 2  0.184 0.212  -0.0162
# 3 -0.836 0.652   0.944 
# 4  1.60  0.126   0.821 
# 5  0.330 0.267   0.594 
# 6 -0.820 0.386   0.919 
# 7  0.487 0.0134  0.782 
# 8  0.738 0.382   0.0746
# 9  0.576 0.870  -1.99  
# 10 -0.305 0.340   0.620 

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    我们可以使用intersect

    library(dplyr)
    tibby %>%
         select(intersect(col_order, names(.)))
    # A tibble: 10 x 3
    #         a      b      d
    #     <dbl>  <dbl>  <dbl>
    # 1 -0.0449 0.935  -0.626
    # 2 -0.0162 0.212   0.184
    # 3  0.944  0.652  -0.836
    # 4  0.821  0.126   1.60 
    # 5  0.594  0.267   0.330
    # 6  0.919  0.386  -0.820
    # 7  0.782  0.0134  0.487
    # 8  0.0746 0.382   0.738
    # 9 -1.99   0.870   0.576
    #10  0.620  0.340  -0.305
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      select(tibby, one_of(col_order))
      
               a      b      d
           <dbl>  <dbl>  <dbl>
       1 -0.0449 0.935  -0.626
       2 -0.0162 0.212   0.184
       3  0.944  0.652  -0.836
       4  0.821  0.126   1.60 
       5  0.594  0.267   0.330
       6  0.919  0.386  -0.820
       7  0.782  0.0134  0.487
       8  0.0746 0.382   0.738
       9 -1.99   0.870   0.576
      10  0.620  0.340  -0.305
      

      【讨论】:

      • 谢谢!有趣的是,one_of 已退役,取而代之的是 any_of/all_of,后者不再对列重新排序。
      • 很好地抓住了@Zian,查了一下,显然all_of 按预期工作(如one_of)但any_of 没有,所以我希望这种行为会改变。它已在tidyselect GH page 上被标记。
      【解决方案3】:

      一种方法是使用match

      tibby[na.omit(match(col_order, names(tibby)))]
      

      如果需要dplyr,可以用作:

      library(dplyr)
      tibby %>% select(na.omit(match(col_order, names(.))))
      
      # A tibble: 10 x 3
      #        a      b      d
      #     <dbl>  <dbl>  <dbl>
      # 1 -0.0449 0.935  -0.626
      # 2 -0.0162 0.212   0.184
      # 3  0.944  0.652  -0.836
      # 4  0.821  0.126   1.60 
      # 5  0.594  0.267   0.330
      # 6  0.919  0.386  -0.820
      # 7  0.782  0.0134  0.487
      # 8  0.0746 0.382   0.738
      # 9 -1.99   0.870   0.576
      #10  0.620  0.340  -0.305
      

      【讨论】:

        猜你喜欢
        • 2022-01-24
        • 2020-03-15
        • 1970-01-01
        • 2020-06-14
        • 1970-01-01
        • 1970-01-01
        • 2017-07-03
        • 1970-01-01
        • 2017-02-21
        相关资源
        最近更新 更多