我正在使用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]]))
}
答案 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]>
为方便起见,我使用了公式语法,其中.x
指map2()
中的第一个向量,而.y
指第二个向量。如果更清晰,则可以执行匿名功能。 (我不确定我是否喜欢带波浪号的方括号。)
mtcars %>%
group_by(carb) %>%
nest() %>%
mutate(n = map2(data, carb, function(x, y) {
print(y)
nrow(x)
})
)