有没有办法在不使用 data.frame 名称的情况下在 magrittr 管道工作流中使用 purrr 获取子数据帧?

Is there a way to get subdataframes with purrr in magrittr pipes workflow without using data.frame name?

也就是说,我有兴趣做与示例中相同的事情,但具有 purrr 个功能。

tibble(a, b = a * 2, c = 1) %>% 
    {lapply(X = names(.), FUN = function(.x) select(., 1:.x))}
[[1]]
# A tibble: 5 x 1
      a
  <int>
1     1
2     2
3     3
4     4
5     5

[[2]]
# A tibble: 5 x 2
      a     b
  <int> <dbl>
1     1     2
2     2     4
3     3     6
4     4     8
5     5    10

[[3]]
# A tibble: 5 x 3
      a     b     c
  <int> <dbl> <dbl>
1     1     2     1
2     2     4     1
3     3     6     1
4     4     8     1
5     5    10     1

如果我命名为 foo <- tibble(a, b = a * 2, c = 1) 我只能这样做,而在 map 中我做了 select(foo, ...),但我想避免这种情况,因为我想改变管道中的命名数据框工作流程。

谢谢!

您可以通过以下方式使用map

library(dplyr)
library(purrr)

tibble(a = 1:5, b = a * 2, c = 1) %>%    
  {map(names(.), function(.x) select(., 1:.x))}

根据您的实际用例,您还可以使用 imap,它将传递列值 (.x) 及其名称 (.y)。

tibble(a = 1:5, b = a * 2, c = 1) %>%    
  imap(function(.x, .y) select(., 1:.y))

#$a
# A tibble: 5 x 1
#      a
#  <int>
#1     1
#2     2
#3     3
#4     4
#5     5

#$b
# A tibble: 5 x 2
#      a     b
#  <int> <dbl>
#1     1     2
#2     2     4
#3     3     6
#4     4     8
#5     5    10

#$c
# A tibble: 5 x 3
#      a     b     c
#  <int> <dbl> <dbl>
#1     1     2     1
#2     2     4     1
#3     3     6     1
#4     4     8     1
#5     5    10     1