问题描述
我创建了一个列表,其中的元素是(命名的)小标题。我想一次对所有小标题应用相同的操作。我确信这很容易实现,但是我什么也找不到:
让我们使用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
})
,
这就是purrr
和map_*
函数家族的作用。实际上,这与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})