我无法理解 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/