【问题标题】:dplyr - how to select columns of certain typedplyr - 如何选择特定类型的列
【发布时间】:2016-04-04 04:40:51
【问题描述】:

有没有一种简洁的方法可以在dplyr 中选择特定类型的列?例如,如何选择dplyr链中的所有字符列?

【问题讨论】:

  • 对 dplyr 包不太熟悉。但是你能做这样的事情吗?类似于class函数:d <- tbl_df(iris); type_sum(d); select(d,which(type_sum(d)=="dbl"))

标签: r dplyr


【解决方案1】:

Dplyr 0.5 有 select_if() 允许你写 select_if(is.character)

【讨论】:

  • 这使得代码比在 dplyr 链中使用 apply 更简洁!
【解决方案2】:

截至dplyr 1.0.0 *_if 功能和朋友已被取代。现在建议使用来自tidyselectselection helper where

https://dplyr.tidyverse.org/reference/select.html
https://tidyselect.r-lib.org/reference/where.html

library(dplyr)

starwars %>% 
    select(where(is.character))
#> # A tibble: 87 x 8
#>    name        hair_color   skin_color eye_color sex   gender  homeworld species
#>    <chr>       <chr>        <chr>      <chr>     <chr> <chr>   <chr>     <chr>  
#>  1 Luke Skywa~ blond        fair       blue      male  mascul~ Tatooine  Human  
#>  2 C-3PO       <NA>         gold       yellow    none  mascul~ Tatooine  Droid  
#>  3 R2-D2       <NA>         white, bl~ red       none  mascul~ Naboo     Droid  
#>  4 Darth Vader none         white      yellow    male  mascul~ Tatooine  Human  
#>  5 Leia Organa brown        light      brown     fema~ femini~ Alderaan  Human  
#>  6 Owen Lars   brown, grey  light      blue      male  mascul~ Tatooine  Human  
#>  7 Beru White~ brown        light      blue      fema~ femini~ Tatooine  Human  
#>  8 R5-D4       <NA>         white, red red       none  mascul~ Tatooine  Droid  
#>  9 Biggs Dark~ black        light      brown     male  mascul~ Tatooine  Human  
#> 10 Obi-Wan Ke~ auburn, whi~ fair       blue-gray male  mascul~ Stewjon   Human  
#> # ... with 77 more rows

reprex package (v0.3.0) 于 2020 年 6 月 2 日创建

【讨论】:

    【解决方案3】:

    你可以这样做

    dt %>% select(which(sapply(.,is.character)))
    

    【讨论】:

      【解决方案4】:

      一种方法是首先获取不同列的类。所以假设我们有一些数据:

      library(dplyr)
      DT <- data.frame(A = letters[1:6], B = c(T,F,F), C = seq(1,2,length.out = 6), D = 1:6)
      dt <- tbl_df(DT)
      dt$A <- as.character(dt$A)
      
      输出
             A     B     C     D
        (chr) (lgl) (dbl) (int)
      1      a  TRUE   1.0     1
      2      b FALSE   1.2     2
      3      c FALSE   1.4     3
      4      d  TRUE   1.6     4
      5      e FALSE   1.8     5
      6      f FALSE   2.0     6
      

      我们现在可以使用 which 函数获取类:

      cls <- sapply(dt, class)
      cls
      
      输出
              A         B         C         D 
       "character" "logical" "numeric" "integer" 
      

      现在直截了当:

      newDF <- dt %>% select(which(cls=="character"))
      newDF
      
      输出
            A
        (chr)
      1     a
      2     b
      3     c
      4     d
      5     e
      6     f
      

      【讨论】:

      • 很好 - 我正在寻找一种可能避免将类放在 dplyr 链之外的方法。
      猜你喜欢
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 2021-09-11
      • 2022-08-02
      • 1970-01-01
      • 2015-10-26
      相关资源
      最近更新 更多