如何使用相对引用列表中的名称访问对象

时间:2019-09-09 17:11:54

标签: r dplyr

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

tablenames <- names(mtcars)

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

tablenames[i]
>>"disp"

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

2 个答案:

答案 0 :(得分:2)

我认为这可能是您要追求的目标

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-09-09创建

另请参阅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

答案 1 :(得分:0)

@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]] 

这使我可以创建数据帧列表,而不是我需要的向量。