【问题标题】:The difference between Map() and map () from Purrr package in RR中Purrr包中Map()和map()的区别
【发布时间】:2021-01-19 14:54:38
【问题描述】:

您好,我正在尝试使用列表名称将名称列添加到列表中的所有元素中。也就是说,我的列表中有 8 个表,每个表都有自己的名称表 1...8。所以稍后我可以取消列出它们并区分表格的来源。

我已阅读这篇文章并且代码有效。 R - Add columns to dataframes in list by looping through elements in a vector

my_list <- Map(cbind, mylist, Cluster = names(mylist))

但是,我不太了解 Map()。这不是 Purrr 包中的 map() 对吗? map() 将按 map(data, function) 的顺序获取参数。我在地图上查看了 Rstudio 帮助,它看起来更混乱。如果我要使用 Purrr 地图功能,我尝试了这个

my_list2 <- map(mylist, function(x)cbind(x,Cluster = names(x)))

它没有用。有人能告诉我 Map 是如何工作的吗?如果我要使用 map(),我应该做些什么改变?

【问题讨论】:

    标签: r


    【解决方案1】:

    它们确实是不同的功能。如果您的列表已经命名,您当然可以使用purrr::map 添加命名列。 Please see this recent question 因为你没有提供任何细节。

    对你想要的最好的猜测是:

    purrr::map2(mylist, names(mylist), ~ mutate(.x, new_column_name = .y))
    

    【讨论】:

    • 不错。是的,我只听说过地图,所以当我看到地图时,我很喜欢。您提供的代码就是一个很好的例子。我也可以问关于 ~ mutate(.x, new_column_name = .y) 的菜鸟问题吗? “~”在这里做什么?对于 .x 和 .y,它们就像 mylist 和 names() 的空间持有者,对吗?
    • 波浪号 ~ 只是让map 知道后面是“公式”的一种方式。 .x 是我们传递的第一个列表(您的数据帧列表)的简写,.y 是指我们传递的第二个列表,即这些数据帧的 namesmap 用于单个列表,map2 用于两个列表(您的情况),pmap 处理三个或更多列表的情况。所以对于列表中的第一个df,答案的公式是mutate(data = mylist[[1]], new_column_name = names(mylist[[1]]))
    • 感谢您的耐心等待,不胜感激。顺便说一句,我应该将波浪号添加到所有通过 map() 的函数吗?
    • 这是我的偏好,但还有其他可能性。例如直接从 doco... "map2(x, y, ~ .x + .y) # 或者只是 map2(x, y, +)"
    • 谢谢 :) 抱歉所有菜鸟问题
    【解决方案2】:

    也许这就是你要找的。要添加具有列表名称的列,您必须遍历列表和名称。这可以通过purrr::imap 轻松实现,它是purrr::map2 的包装器,或者您可以使用基础Map。主要区别可能是在Map 中,要应用的函数是第一个参数。此外,purrr 系列的 map 函数允许使用公式表示法(参见我的代码中的示例)来编写匿名函数

    mylist <- list(
      a = data.frame(x = 1 , y = 2),
      b = data.frame(x = 3, y = 4)
    )
    
    purrr::imap(mylist, ~ cbind(.x, Cluster = .y))
    #> $a
    #>   x y Cluster
    #> 1 1 2       a
    #> 
    #> $b
    #>   x y Cluster
    #> 1 3 4       b
    
    Map(function(x, y) { cbind(x, Cluster = y) }, mylist, names(mylist))
    #> $a
    #>   x y Cluster
    #> 1 1 2       a
    #> 
    #> $b
    #>   x y Cluster
    #> 1 3 4       b
    

    【讨论】:

    • 太棒了。感谢您帮助我了解地图和地图
    猜你喜欢
    • 1970-01-01
    • 2013-03-17
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2013-03-27
    相关资源
    最近更新 更多