2017-09-15 44 views
1

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

我努力工作,没有管,但我不知道如何与管道做到这一点:

例如,使用该数据帧:

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 

我是否需要做某种不明或者以不同的方式引用逻辑向量?

+1

要做到这一点在管道为什么呢? a_pair对象在工作表达式中显示两次,所以任何管道都必须变得复杂。当LHS是RHS的第一个参数时,管道很好,当LHS在RHS中出现一次时,管道很好,但当事情变得更加复杂时,它们是不可读的。 – user2554330

+0

老实说,我没有工作,这对我的直接需求没问题,所以主要是因为我很好奇如何用管道做到这一点! – bheavner

回答

2

您应该使用

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

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

或者如果包括magrittr库,你可以做

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