【问题标题】:How to access an object using relative reference to name in list如何使用对列表中名称的相对引用来访问对象
【发布时间】:2019-09-09 17:11:54
【问题描述】:

我试图从本质上将我拥有的数据帧拆分为几个不同的数据帧,每个数据帧只是原始数据帧的一列,并将每个数据帧存储在一个列表中。我用原始列名命名这些新数据框中的每一个,但不知道如何访问对象(数据框)而不是简单的列名。下面的简单例子:

tablenames <- names(mtcars)

for (i in 1:3) {
  assign(paste0(tablenames[i]), mtcars %>% select(paste0(tablenames[i])))
}

tablenames[i]
>>"disp"

我想返回创建的对象disp,而不是"disp"(但实际上不输入disp)。这可能吗?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我想这可能是你想要的:

    library(dplyr)
    tablenames <- vector('list', length = length(names(mtcars)))
    tablenames <- setNames(tablenames, names(mtcars))
    
    for (i in 1:3) {
      tablenames[i] <- mtcars %>% select(names(tablenames[i]))
    }
    
    str(tablenames)
    #> List of 11
    #>  $ mpg : num [1:32] 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
    #>  $ cyl : num [1:32] 6 6 4 6 8 6 8 4 4 6 ...
    #>  $ disp: num [1:32] 160 160 108 258 360 ...
    #>  $ hp  : NULL
    #>  $ drat: NULL
    #>  $ wt  : NULL
    #>  $ qsec: NULL
    #>  $ vs  : NULL
    #>  $ am  : NULL
    #>  $ gear: NULL
    #>  $ carb: NULL
    tablenames[3]
    #> $disp
    #>  [1] 160.0 160.0 108.0 258.0 360.0 225.0 360.0 146.7 140.8 167.6 167.6
    #> [12] 275.8 275.8 275.8 472.0 460.0 440.0  78.7  75.7  71.1 120.1 318.0
    #> [23] 304.0 350.0 400.0  79.0 120.3  95.1 351.0 145.0 301.0 121.0
    

    reprex package (v0.3.0) 于 2019 年 9 月 9 日创建

    另见tablenames[[3]]

    不过,更好的方法是利用tibble::enframepurrr::map

    library(tidyverse)
    
    mtcars %>%
      map(enframe, name = NULL)
    #> $mpg
    #> # A tibble: 32 x 1
    #>    value
    #>    <dbl>
    #>  1  21  
    #>  2  21  
    #>  3  22.8
    #>  4  21.4
    #>  5  18.7
    #>  6  18.1
    #>  7  14.3
    #>  8  24.4
    #>  9  22.8
    #> 10  19.2
    #> # ... with 22 more rows
    #> 
    #> $cyl
    #> # A tibble: 32 x 1
    #>    value
    #>    <dbl>
    #>  1     6
    #>  2     6
    #>  3     4
    #>  4     6
    #>  5     8
    #>  6     6
    #>  7     8
    #>  8     4
    #>  9     4
    #> 10     6
    #> # ... with 22 more rows
    #> 
    #> $disp
    #> # A tibble: 32 x 1
    #>    value
    #>    <dbl>
    #>  1  160 
    #>  2  160 
    #>  3  108 
    #>  4  258 
    #>  5  360 
    #>  6  225 
    #>  7  360 
    #>  8  147.
    #>  9  141.
    #> 10  168.
    #> # ... with 22 more rows
    #> 
    #> $hp
    #> # A tibble: 32 x 1
    #>    value
    #>    <dbl>
    #>  1   110
    #>  2   110
    #>  3    93
    #>  4   110
    #>  5   175
    #>  6   105
    #>  7   245
    #>  8    62
    #>  9    95
    #> 10   123
    #> # ... with 22 more rows
    #> 
    #> $drat
    #> # A tibble: 32 x 1
    #>    value
    #>    <dbl>
    #>  1  3.9 
    #>  2  3.9 
    #>  3  3.85
    #>  4  3.08
    #>  5  3.15
    #>  6  2.76
    #>  7  3.21
    #>  8  3.69
    #>  9  3.92
    #> 10  3.92
    #> # ... with 22 more rows
    #> 
    #> $wt
    #> # A tibble: 32 x 1
    #>    value
    #>    <dbl>
    #>  1  2.62
    #>  2  2.88
    #>  3  2.32
    #>  4  3.22
    #>  5  3.44
    #>  6  3.46
    #>  7  3.57
    #>  8  3.19
    #>  9  3.15
    #> 10  3.44
    #> # ... with 22 more rows
    #> 
    #> $qsec
    #> # A tibble: 32 x 1
    #>    value
    #>    <dbl>
    #>  1  16.5
    #>  2  17.0
    #>  3  18.6
    #>  4  19.4
    #>  5  17.0
    #>  6  20.2
    #>  7  15.8
    #>  8  20  
    #>  9  22.9
    #> 10  18.3
    #> # ... with 22 more rows
    #> 
    #> $vs
    #> # A tibble: 32 x 1
    #>    value
    #>    <dbl>
    #>  1     0
    #>  2     0
    #>  3     1
    #>  4     1
    #>  5     0
    #>  6     1
    #>  7     0
    #>  8     1
    #>  9     1
    #> 10     1
    #> # ... with 22 more rows
    #> 
    #> $am
    #> # A tibble: 32 x 1
    #>    value
    #>    <dbl>
    #>  1     1
    #>  2     1
    #>  3     1
    #>  4     0
    #>  5     0
    #>  6     0
    #>  7     0
    #>  8     0
    #>  9     0
    #> 10     0
    #> # ... with 22 more rows
    #> 
    #> $gear
    #> # A tibble: 32 x 1
    #>    value
    #>    <dbl>
    #>  1     4
    #>  2     4
    #>  3     4
    #>  4     3
    #>  5     3
    #>  6     3
    #>  7     3
    #>  8     4
    #>  9     4
    #> 10     4
    #> # ... with 22 more rows
    #> 
    #> $carb
    #> # A tibble: 32 x 1
    #>    value
    #>    <dbl>
    #>  1     4
    #>  2     4
    #>  3     1
    #>  4     1
    #>  5     2
    #>  6     1
    #>  7     4
    #>  8     2
    #>  9     2
    #> 10     4
    #> # ... with 22 more rows
    

    【讨论】:

      【解决方案2】:

      @JasonAizkalns 的答案确实有效,但我发现使用 get() 函数的解决方案更简单。

      tablenames <- names(mtcars)
      tables <- list()
      
      for (i in 1:3) {
        assign(paste0(tablenames[i]), mtcars %>% dplyr::select(paste0(tablenames[i])))
        tables[[i]] <- get(tablenames[i])
        rownames(tables[[i]]) <- c()
      } 
      
      tables[[2]] 
      

      这允许我创建一个数据框列表,而不是我需要的向量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-15
        • 2023-01-11
        • 2015-04-05
        • 2017-12-29
        • 2021-05-24
        • 2012-06-09
        相关资源
        最近更新 更多