r - 使用 purrr::map 从列表中提取时出现意外行为

标签 r purrr

我无法理解 purrr::map 的行为方式,例如,它的工作原理:

irisList <- list(iris, iris, iris)
carsList <- list(cars, cars, cars)
airqualityList <- list(airquality, airquality, airquality)

irisList %>% map("Species") %>% str(vec.len = 2)

> List of 3 : 
> $ : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 ...  
> $ : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 ...  
> $ : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 ...

carsList %>% map("speed") %>% str(vec.len = 2)

> List of 3
> $ : num [1:50] 4 4 7 7 8 ...
> $ : num [1:50] 4 4 7 7 8 ...
> $ : num [1:50] 4 4 7 7 8 ...

airqualityList %>% map("Ozone") %>% str(vec.len = 2)

> List of 3
> $ : int [1:153] 41 36 12 18 NA ...
> $ : int [1:153] 41 36 12 18 NA ...
> $ : int [1:153] 41 36 12 18 NA ...

这也有效:

mixedList <- list(iris, cars, airquality)

mixedList %>% map("Species") %>% str(vec.len = 2)
> List of 3
> $ : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 ...
> $ : NULL
> $ : NULL

重复但映射“速度”或“臭氧”会给出预期的响应。但是,如果我让它变得更复杂一些,事情就开始不会像我预期的那样返回:

unNamedList <- list(list(iris, iris, iris),
                list(cars, cars, cars),
                list(airquality, airquality,airquality))
unNamedList %>%  map("Species")

> [[1]]
> NULL

> [[2]]
> NULL

> [[3]]
> NULL

根据 purrr 用户手册,如果我有一个命名列表,我应该能够执行以下操作:

namedIrisList <- list("iris1" = iris,
                      "iris2" = iris,
                      "iris3" = iris)

namedCarsList <- list("cars1" = cars,
                      "cars2" = cars,
                      "cars3" = cars)

namedAirqualityList <- list("aq1" = airquality,
                            "aq2" = airquality,
                            "aq3" = airquality) 

aNamedList <- list("flowers" = namedIrisList,
                   "autos" = namedCarsList,
                   "aq" = namedAirqualityList)

aNamedList %>% map("flowers","Species")

> $flowers
> NULL

> $autos
> NULL

> $aq
> NULL

所以 purrr::map “知道”“物种”在哪里,但不返回任何内容。

因为我们知道“物种”所在的位置,所以这应该可行

 aNamedList %>% map("flowers","iris1","Species")

但我得到了同样的回应。

> $flowers
> NULL

> $autos
> NULL

> $aq
> NULL

我想我不明白应该如何使用map()的提取能力。

上下文是我正在处理引导结果的混合列表,其中我想要的元素位于具有不同名称和结构的大型列表中。我一直在尝试访问“列表列表”组件,但我不断从 map() 返回“Null”。

最佳答案

您可以使用modify_depth从列表列表中提取所需的向量。您指定depth ,即您想要使用的列表级别。在您的示例中,您正在处理第二级列表。

来自文档:

modify_depth(x, 0, fun) is equivalent to x[] <- fun(x)
modify_depth(x, 1, fun) is equivalent to x[] <- map(x, fun)
modify_depth(x, 2, fun) is equivalent to x[] <- map(x, ~ map(., fun))

因此此代码返回 Species NULL栏目对于嵌套列表的每个元素:

aNamedList %>% modify_depth(2, "Species")

对于嵌套列表的单个元素(例如 iris1 ),您可以像以前一样使用名称。但是,顶级列表是您要循环的内容,因此您不会引用这些名称。例如,当您检查 names(aNamedList[[1]]) 时返回"iris1" "iris2" "iris3"而不是"flowers" .

你可以使用

aNamedList %>% map("iris1", "Species")

获取Species任何名为 iris1 的嵌套列表的列.

关于r - 使用 purrr::map 从列表中提取时出现意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46004464/

相关文章:

r - (因子)数据帧列的小写

r - 如何使用 purrr 迭代 lm reg 中协变量和结果的每个组合

r - 根据标准 (R) 生成滚动计数

r - 条件下的数据分组

R - 使用列表中每个项目的第一个元素过滤列表

r - 在 purrr :walk() 中使用assign()

r - 更改数据框中多个变量的属性

r - 如何使用 purrr reshape 模拟函数的输出

r - R:返回具有多个列的data.frame的pmin或pmax

r - 计算一个数字(因子)在每组中出现的次数