对R中的列表中的所有小标题应用相同的操作

问题描述

我创建了一个列表,其中的元素是(命名的)小标题。我想一次对所有小标题应用相同的操作。我确信这很容易实现,但是我什么也找不到:

让我们使用mtcars dat集。我的列表看起来像这样,但更大:

allData <- mtcars %>%
  group_by(cyl) %>%
  group_map(~ head(.x,2L))

现在,我要计算ratio,即马力/齿轮

在data.table中,我只会使用:

dt[,ratio := hp/gear]

但是我不确定如何对列表中组织的多个小标题应用相同的操作?

也许将它们转换为其他格式会更有效吗?

我打算对小标题进行更复杂的操作,我只是想在一个简单的示例上弄清楚如何做到这一点。

解决方法

通过lapply进行操作:

lapply(allData,function(x) transform(x,ratio = hp/gear))
#Or
lapply(allData,function(x) dplyr::mutate(x,ratio = hp/gear))

因此,如果您要在每个列表中执行其他一些复杂的操作,则可以扩展匿名函数。

lapply(allData,function(x) {
   x <- transform(x,ratio = hp/gear)
   #More things to do
})
,

这就是purrrmap_*函数家族的作用。实际上,这与lapply()解决方案是一样的,但是您无需声明匿名函数。

library(purrr)

allData %>% 
  map( ~ mutate(.x,ratio = hp/gear))

您可以使其更加复杂,包括熟悉的管道。

allData %>% 
  map( ~ .x %>% 
           mutate(ratio = hp/gear) %>%
           ...)
,

我们也可以使用

 lapply(allData,function(x) {x$ratio <- x$hp/x$gear; x})