我有一个数据框列表。我想使用purrr
遍历它们并进行一些分析。分析的一部分包括根据列表项的名称重命名变量。这使我可以将文件正确合并到单个数据框中。我对如何完成此工作有些困惑。
library(tidyverse)
# Get names of columns
df <- mtcars %>%
as_tibble() %>%
select(1:5)
mtcars_names <- df %>%
names()
# Split into many dataframes based on columns
mtcars_ls <- df %>%
gather(key, value) %>%
split(.$key)
map2(mtcars_ls, mtcars_names, function(x, y){
x %>%
rename(y = value)
})
#> $cyl
#> # A tibble: 32 x 2
#> key y
#> <chr> <dbl>
#> 1 cyl 6
#> 2 cyl 6
#> 3 cyl 4
#> 4 cyl 6
#> 5 cyl 8
#> 6 cyl 6
#> 7 cyl 8
#> 8 cyl 4
#> 9 cyl 4
#> 10 cyl 6
#> # … with 22 more rows
#>
#> $disp
#> # A tibble: 32 x 2
#> key y
#> <chr> <dbl>
#> 1 disp 160
#> 2 disp 160
#> 3 disp 108
#> 4 disp 258
#> 5 disp 360
#> 6 disp 225
#> 7 disp 360
#> 8 disp 147.
#> 9 disp 141.
#> 10 disp 168.
#> # … with 22 more rows
#>
#> $drat
#> # A tibble: 32 x 2
#> key y
#> <chr> <dbl>
#> 1 drat 3.9
#> 2 drat 3.9
#> 3 drat 3.85
#> 4 drat 3.08
#> 5 drat 3.15
#> 6 drat 2.76
#> 7 drat 3.21
#> 8 drat 3.69
#> 9 drat 3.92
#> 10 drat 3.92
#> # … with 22 more rows
#>
#> $hp
#> # A tibble: 32 x 2
#> key y
#> <chr> <dbl>
#> 1 hp 110
#> 2 hp 110
#> 3 hp 93
#> 4 hp 110
#> 5 hp 175
#> 6 hp 105
#> 7 hp 245
#> 8 hp 62
#> 9 hp 95
#> 10 hp 123
#> # … with 22 more rows
#>
#> $mpg
#> # A tibble: 32 x 2
#> key y
#> <chr> <dbl>
#> 1 mpg 21
#> 2 mpg 21
#> 3 mpg 22.8
#> 4 mpg 21.4
#> 5 mpg 18.7
#> 6 mpg 18.1
#> 7 mpg 14.3
#> 8 mpg 24.4
#> 9 mpg 22.8
#> 10 mpg 19.2
#> # … with 22 more rows
Created on 2019-09-03 by the reprex package (v0.3.0)
答案 0 :(得分:3)
purrr
中实际上有一个名为imap
的不错的函数,它似乎可以满足您的需求。遍历列表的元素(.x
)和名称(.y
):
df <- mtcars %>%
select(1:5)
# Split into many dataframes based on columns and create a named list
mtcars_ls <- df %>%
gather(key, value) %>%
split(.$key) %>%
set_names(names(df))
imap(mtcars_ls, function(x,y) {
x %>%
rename(!!quo_name(y) := value)
})
!!quo_name
和:=
允许整洁地评估名称字符串。为了简化操作,您可以使用简写形式:
imap(mtcars_ls, ~ rename(.x, !!quo_name(.y) := value))
答案 1 :(得分:2)
也许您可以使用rename_at
library(purrr)
library(dplyr)
map2(mtcars_ls, mtcars_names, function(x, y){
x %>% rename_at(vars(value), ~y) %>% head
})
#$cyl
# A tibble: 6 x 2
# key mpg
# <chr> <dbl>
#1 cyl 6
#2 cyl 6
#3 cyl 4
#4 cyl 6
#5 cyl 8
#6 cyl 6
#$disp
# A tibble: 6 x 2
# key cyl
# <chr> <dbl>
#1 disp 160
#2 disp 160
#3 disp 108
#4 disp 258
#5 disp 360
#6 disp 225
#....
答案 2 :(得分:1)
这是一个解决方案,可以逐案生成您的代码作为文本,然后对其进行评估:
library(tidyverse)
# Get names of columns
df <- mtcars %>%
as_tibble() %>%
select(1:5)
mtcars_names <- df %>%
names()
# Split into many dataframes based on columns
mtcars_ls <- df %>%
gather(key, value) %>%
split(.$key)
map2(mtcars_ls, mtcars_names, function(x, y){
eval(parse(text = paste0('rename(x,',y,' = value)')))
})
#> $cyl
#> # A tibble: 32 x 2
#> key mpg
#> <chr> <dbl>
#> 1 cyl 6
#> 2 cyl 6
#> 3 cyl 4
#> 4 cyl 6
#> 5 cyl 8
#> 6 cyl 6
#> 7 cyl 8
#> 8 cyl 4
#> 9 cyl 4
#> 10 cyl 6
#> # … with 22 more rows
#>
#> $disp
#> # A tibble: 32 x 2
#> key cyl
#> <chr> <dbl>
#> 1 disp 160
#> 2 disp 160
#> 3 disp 108
#> 4 disp 258
#> 5 disp 360
#> 6 disp 225
#> 7 disp 360
#> 8 disp 147.
#> 9 disp 141.
#> 10 disp 168.
#> # … with 22 more rows
#>
#> $drat
#> # A tibble: 32 x 2
#> key disp
#> <chr> <dbl>
#> 1 drat 3.9
#> 2 drat 3.9
#> 3 drat 3.85
#> 4 drat 3.08
#> 5 drat 3.15
#> 6 drat 2.76
#> 7 drat 3.21
#> 8 drat 3.69
#> 9 drat 3.92
#> 10 drat 3.92
#> # … with 22 more rows
#>
#> $hp
#> # A tibble: 32 x 2
#> key hp
#> <chr> <dbl>
#> 1 hp 110
#> 2 hp 110
#> 3 hp 93
#> 4 hp 110
#> 5 hp 175
#> 6 hp 105
#> 7 hp 245
#> 8 hp 62
#> 9 hp 95
#> 10 hp 123
#> # … with 22 more rows
#>
#> $mpg
#> # A tibble: 32 x 2
#> key drat
#> <chr> <dbl>
#> 1 mpg 21
#> 2 mpg 21
#> 3 mpg 22.8
#> 4 mpg 21.4
#> 5 mpg 18.7
#> 6 mpg 18.1
#> 7 mpg 14.3
#> 8 mpg 24.4
#> 9 mpg 22.8
#> 10 mpg 19.2
#> # … with 22 more rows
由reprex package(v0.3.0)于2019-09-03创建