我实际上试图将我拥有的数据帧拆分为几个不同的数据帧,每个数据帧仅是原始数据帧的一列,并将每个数据帧存储在列表中。我用原始列名为这些新数据框命名,但不知道如何访问对象(数据框)而不是简单地访问列名。下面是一个简单的示例:
tablenames <- names(mtcars)
for (i in 1:3) {
assign(paste0(tablenames[i]), mtcars %>% select(paste0(tablenames[i])))
}
tablenames[i]
>>"disp"
我想返回创建的对象"disp"
,而不是disp
(但无需实际键入disp)。这可能吗?
答案 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::enframe
和purrr::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]]
这使我可以创建数据帧列表,而不是我需要的向量。