【问题标题】:Getting map from purrr to work with paste0从 purrr 获取地图以使用 paste0
【发布时间】:2019-01-18 04:30:14
【问题描述】:

我有 9 个列表,其中包含对象 groupings$ag。我正在尝试从 9 个列表中的每一个中提取该对象,并将它们放入 tibble/df 的列中。第一列应该有 1:5 组。随后的 9 列,每列都是一个带有 5 个数字的简单向量。抱歉,这不完整且不可复制..

map(hof2009_ag$groupings, "ag") %>% unlist 会正确地给我一个向量

[1] 789 615 525 425 352

但如果我动态地使用带有 paste0 的地图,它将无法工作:
map(paste0("hof", i,"_ag$groupings"), "ag").

所以,我试图获取 9 个列表,标题为 hof2009:hof2017,通过 for 循环使用迭代器访问每个列表。当我尝试使用 paste0 动态创建我的 hof(i)_ag$groupings 时,它不再适用于地图。

ag <- tibble(group=1:5)
for (i in 2009:2017) {
temp <- paste0("hof", i,"_ag$groupings") #works, "hof2009_ag$groupings"
TEST <- temp %>% map("ag") %>% unlist #fails, produces NULL
TEST <- hof2009_ag$groupings %>% map("ag") %>% unlist #works, produces 789 615 525 425 352
#ag <- map(temp, "ag") %>% unlist #doesn't work on "temp"
}

第二个问题是如何将这些添加为列。我玩过 add_column 和 mutate 和 ag[,i-2008],但只要 map 不能使用 paste,就无法让它工作。

如果我使用:

mget(paste0("hof", 2009:2009, "_ag")) %>%
map("groupings") %>% str 

我明白了:

List of 1
 $ hof2009_ag:List of 5
 ..$ :List of 6
 .. ..$ prefs   :'data.frame':  14 obs. of  1 variable:
.. .. ..$ rank: int [1:14] 0 3 3 4 1 0 1 2 1 0 ...
.. ..$ ag      : int 789
.. ..$ grp     : int [1:60] 1 1 1 1 1 1 1 1 1 1 ...
.. ..$ iters   : num 1
.. ..$ run_time: Named num 1.13
.. .. ..- attr(*, "names")= chr "elapsed"
..$ :List of 6
.. ..$ prefs   :'data.frame':   14 obs. of  2 variables:
.. .. ..$ rank  : int [1:14] 0 3 4 5 2 1 2 3 1 1 ...
.. .. ..$ rank.1: int [1:14] 2 4 4 5 1 0 3 3 2 1 ...
.. ..$ ag      : int 615
.. ..$ grp     : int [1:60] 1 1 1 1 1 1 1 1 1 1 ...
.. ..$ iters   : num 4
.. ..$ run_time: Named num 5.61
.. .. ..- attr(*, "names")= chr "elapsed"

编辑:使用 dput 的示例

> dput(hof2009_ag)

list(decision_makers = c("Phil.Arvia", "Steve.Aschburner", "Filip.Bondy", "Bob.Verdi"), Alternatives = c("Harold.Baines", "Bert.Blyleven", “艾伦·特拉梅尔” ), number_decision_makers = 60L, num_alts = 14L, groupings = list(list(prefs = structure(list(rank = c(0L, 3L, 3L, 4L, 1L, 0L, 1L)), class= "data.frame", row.names = c("Harold.Baines", "Bert.Blyleven", "Alan.Trammell")), ag = 789L, grp = c(1L, 1L, 1L), iters = 1, run_time = c(elapsed = 1.12999999999738),grp2 =结构(列表(Decision_Maker = c(“Phil.Arvia”,“Steve.Aschburner”,“Filip.Bondy”,“Dave.Van.Dyck”,“Bob.Verdi”),Group_Number = c ("1", "1", "1", "1", "1")), row.names = c(NA, -60L), class= c("tbl_df", "tbl", "data.框架"))),列表(首选项 = 结构(列表(等级 = c(0L,3L,2L),rank.1 = c(2L,4L,2L)),class=“data.frame”,row.names = c("Harold.Baines", "Bert.Blyleven", "Andre.Dawson", "Alan.Trammell"), ag = 615L, grp = c(1L, 1L, 1L), iters = 4, run_time = c (经过 = 5.61000000000058),grp2 = 结构(列表(Decision_Maker = c(“Phil.Arvia”,“Steve.Aschburner”,“Steve.Wilmoth”,“Dave.Van.Dyck”,“Bob.Verdi”),Group_Number = c("1", "1", "1", "1")), row.names = c(NA, -60L), class= c("tbl_df", "tbl", "data.frame"))), list(prefs = structure(list(rank = c(0L, 3L, 1L, 1L), rank.1 = c(0L, 4L, 2L), rank.2 = c(1L, 2L, 2L))

【问题讨论】:

  • 最好使用[[ 而不是$。另外,如果这些对象在全局环境中,请使用mgetmget(paste0("hof", 2009:2017, "_ag")) %&gt;% map(~ .x %&gt;% select(groupings)) %&gt;% unlist 虽然没有一个小的可重复示例,但不清楚
  • 快速澄清:我的对象在 hof_2009:2017$groupings$ag 下。那么 map 应该选择分组,然后是 ag 吗?我认为您的代码的一个小调整可能会做到...

标签: r dplyr purrr


【解决方案1】:

一个可重现的例子会很有用。根据显示的代码,使用mgetpaste 获取全局环境中的对象,然后循环遍历list 元素、select 'groupings' list 元素和'ag'(嵌套@987654326 @) 与 $[[

library(tidyverse)
mget(paste0("hof", 2009:2017, "_ag")) %>%
        map(~ map(.x$groupings, ~ .x$ag)) 

【讨论】:

  • 这可能会有所帮助.. groupings 是 hof2009_ag 下的子列表。而 ag 是分组下的列表。所以列也不是。然后我要双重地图吗?像这样:$hof2017_ag$groupings[[5]]$ag[1] 5173
  • 啊几乎。我认为映射需要在分组内完成,因为没有 groupings$ag,只有 groupings[[i]]$ag。因此,在提取 ag 之前,需要以某种方式拆分 5 个分组
  • @DSchiff 你能检查mget(paste0("hof", 2009:2017, "_ag")) %&gt;% map(~ .x$groupings %&gt;% map(.x %&gt;% pull('ag')))的输出吗
  • 你打赌:还没有运气! UseMethod("pull") 中的错误:没有适用的“pull”方法应用于“list”类的对象
  • @DSchiff 你能用dput 的小例子更新你的帖子,以便我可以测试它
猜你喜欢
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
相关资源
最近更新 更多