【问题标题】:Pipe tibble with a list of logical vectors to map2()带有逻辑向量列表的管道 tibble 到 map2()
【发布时间】:2017-09-15 18:40:34
【问题描述】:

如何将由逻辑向量列表和字符向量列表组成的数据帧通过管道传输到purrr::map2(),以使用逻辑向量对字符向量进行子集化?

我的努力在没有管道的情况下工作,但我不确定如何使用管道:

例如,使用这个数据框:

a_pair = tibble(mask = list(TRUE, c(FALSE, TRUE), TRUE, TRUE, 
                            c(FALSE, FALSE, FALSE, TRUE), TRUE, TRUE, TRUE, 
                            TRUE, c(FALSE, FALSE, FALSE, TRUE)),
                strings = list(".", c("0.29966", "0.31145"), "0.48243", 
                               "0.55122", 
                               c("0.10099", "0.10142", "0.49873", "0.56246"), 
                               "0.56246", "0.10127", "0.70687", "0.68338", 
                               c("0.03365", "0.16895", "0.68338", "0.82954")))

这行得通:

library(purrr)

map2(a_pair$mask, a_pair$strings, function(logical, string) subset(string, logical))

但这(如a related question 中所建议的)不会:

a_pair %>% map2(., names(.), ~{subset(.y, .x)})
Error in subset.default(.y, .x) : 'subset' must be logical

我是否需要进行某种取消列出,或以不同的方式引用逻辑向量?

【问题讨论】:

  • 为什么要在管道中执行此操作? a_pair 对象在有效的表达式中出现了两次,因此任何管道都必须是复杂的。当 LHS 是 RHS 的第一个参数时,管道很棒,当 LHS 在 RHS 中出现一次时也可以,但是当事情变得更复杂时,它们就变得不可读了。
  • 老实说,我可以在没有它的情况下使用它,这可以满足我的即时需求,主要是因为我很好奇如何使用管道来完成它!

标签: r purrr


【解决方案1】:

你应该使用

library(dplyr)
a_pair %>% {map2(.$strings, .$mask, subset)}

使用{} 有助于防止数据作为第一个参数自动传递。

或者如果你包含 magrittr 库,你可以这样做

library(magrittr)
a_pair %$% map2(strings, mask, subset)

【讨论】:

    猜你喜欢
    • 2013-10-15
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    相关资源
    最近更新 更多