【问题标题】:Creating a named vector using dplyr使用 dplyr 创建命名向量
【发布时间】:2018-08-26 09:31:26
【问题描述】:

我正在尝试找到一种方法,使用管道从数据框中的两列(一个值,一个名称)创建命名向量。到目前为止,我有以下(使用mtcars 作为示例数据)...

library(tidyverse)

x <- mtcars %>%
  rownames_to_column("car") %>%
  select(car, mpg)
  pull(mpg)

names(x) <- row.names(mtcars)

x
#            Mazda RX4       Mazda RX4 Wag          Datsun 710      Hornet 4 Drive   Hornet Sportabout 
#                 21.0                21.0                22.8                21.4                18.7 
#              Valiant          Duster 360           Merc 240D            Merc 230            Merc 280 
#                 18.1                14.3                24.4                22.8                19.2 
#            Merc 280C          Merc 450SE          Merc 450SL         Merc 450SLC  Cadillac Fleetwood 
#                 17.8                16.4                17.3                15.2                10.4 
#  Lincoln Continental   Chrysler Imperial            Fiat 128         Honda Civic      Toyota Corolla 
#                 10.4                14.7                32.4                30.4                33.9 
#        Toyota Corona    Dodge Challenger         AMC Javelin          Camaro Z28    Pontiac Firebird 
#                 21.5                15.5                15.2                13.3                19.2 
#            Fiat X1-9       Porsche 914-2        Lotus Europa      Ford Pantera L        Ferrari Dino 
#                 27.3                26.0                30.4                15.8                19.7 
#        Maserati Bora          Volvo 142E 
#                 15.0                21.4 

当涉及到我的实际数据时,这不是很方便,因为我想避免保存转换后的数据框的副本以仅将名称列用于 name 函数。

【问题讨论】:

  • 这里为什么需要链? setNames(mtcars$mpg, row.names(mtcars))
  • @akun 我已经有一条大链来获得我的 mtcars 等价物 - 只是想知道是否有办法完成它以获得我想要的对象而不必打破链并保存将两列数据框作为单独的对象
  • 试试mtcars %&gt;% rownames_to_column("car") %&gt;% {'names&lt;-'(.$mpg, .$car)}
  • @akun 太棒了!!

标签: r vector dplyr


【解决方案1】:

由于tibble1.3.0(2017-04-02),您可以使用tibble::deframe()

library(tidyverse)

mtcars %>%
  rownames_to_column("car") %>%
  select(car, mpg) %>% 
  deframe()

          Mazda RX4       Mazda RX4 Wag          Datsun 710 
               21,0                21,0                22,8 
     Hornet 4 Drive   Hornet Sportabout             Valiant 
               21,4                18,7                18,1 
         Duster 360           Merc 240D            Merc 230 
               14,3                24,4                22,8 
           Merc 280           Merc 280C          Merc 450SE 
               19,2                17,8                16,4 
         Merc 450SL         Merc 450SLC  Cadillac Fleetwood 
               17,3                15,2                10,4 
Lincoln Continental   Chrysler Imperial            Fiat 128 
               10,4                14,7                32,4 
        Honda Civic      Toyota Corolla       Toyota Corona 
               30,4                33,9                21,5 
   Dodge Challenger         AMC Javelin          Camaro Z28 
               15,5                15,2                13,3 
   Pontiac Firebird           Fiat X1-9       Porsche 914-2 
               19,2                27,3                26,0 
       Lotus Europa      Ford Pantera L        Ferrari Dino 
               30,4                15,8                19,7 
      Maserati Bora          Volvo 142E 
               15,0                21,4 

【讨论】:

    【解决方案2】:

    我们可以使用names&lt;- 来获得一个命名的vector

    library(tidyverse)
    mtcars %>% 
       rownames_to_column("car") %>%
       {'names<-'(.$mpg, .$car)}
    

    set_names

    mtcars %>% 
       rownames_to_column("car") %>% 
       select(x = mpg, nm = car) %>%
       pmap(set_names) %>% 
       unlist
    

    【讨论】:

    • %$% from magrittr 在这种情况下很有用。 mtcars %&gt;% rownames_to_column("car") %$% 'names&lt;-'(mpg, car)
    • @Ryan 您可以将其作为答案。我发现它是使用%$% 的一个很好的例子。
    猜你喜欢
    • 2014-11-24
    • 1970-01-01
    • 2021-10-27
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2022-12-14
    相关资源
    最近更新 更多