如何打印R中作用于purrr :: map的数据帧的行

时间:2018-08-03 00:35:02

标签: r for-loop tidyverse purrr

我正在使用purrr::map在长数据框列表列上运行耗时的函数,并且我想打印正在执行的行的指示器,以便跟踪进度。 / p>

这是一个小例子:

运行此命令时:

library(dplyr)
library(tidyr)
library(purrr)
mtcars %>% 
    group_by(carb) %>% 
    nest() %>% 
    mutate(n = map(data, nrow))

我想输出要执行的行的carb

#> 4
#> 1
#> 2
#> 3
#> 6
#> 8

使用for这样的循环可以达到以下目的:

df <-
    mtcars %>% 
    group_by(carb) %>% 
    nest() %>% 
    mutate(n = NA)
for (i in 1:nrow(df)) {
    print(df$carb[i])
    df$n[i] <- list(nrow(df$data[[i]]))
}

1 个答案:

答案 0 :(得分:4)

使用carb可以同时运行data,同时运行map2()。然后,您可以在函数中添加print()语句以输出carb

dat = mtcars %>% 
    group_by(carb) %>% 
    nest() %>% 
    mutate(n = map2(data, carb, ~{
        print(.y)
        nrow(.x)
        }) 
        )

[1] 4
[1] 1
[1] 2
[1] 3
[1] 6
[1] 8

dat
# A tibble: 6 x 3
   carb data               n        
  <dbl> <list>             <list>   
1     4 <tibble [10 x 11]> <int [1]>
2     1 <tibble [7 x 11]>  <int [1]>
3     2 <tibble [10 x 11]> <int [1]>
4     3 <tibble [3 x 11]>  <int [1]>
5     6 <tibble [1 x 11]>  <int [1]>
6     8 <tibble [1 x 11]>  <int [1]>

为方便起见,我使用了公式语法,其中.xmap2()中的第一个向量,而.y指第二个向量。如果更清晰,则可以执行匿名功能。 (我不确定我是否喜欢带波浪号的方括号。)

mtcars %>% 
    group_by(carb) %>% 
    nest() %>% 
    mutate(n = map2(data, carb, function(x, y) {
        print(y)
        nrow(x)
        })
        )