应用在vector / data.frame列上返回data.frame / tibble并绑定结果的函数

时间:2019-02-22 12:09:25

标签: r dplyr tidyverse purrr

我有一个从数据库中获取一些数据的函数。它采用单个参数并返回一个data.frame。我想使用这些参数的输入向量,并将它们通过管道传递给map或类似的函数,该函数接受每个要素并返回db结果。结果在行中可以有所不同,但列始终相同。我如何不进行循环和行绑定? (因为我在..)

我尝试了以下路线:

myfuncSingleRow<-function(nbr){ 
data.frame(a=nbr,b=nbr^2,c=nbr^3)}

myfuncMultipleRow<-function(nbr){ 
    data.frame(a=rep(nbr,3),b=rep(nbr^2,3),c=rep(nbr^3,3))}

a<-data.frame(count=c(1,2,3))

myfuncSingleRow(2)
myfuncMultipleRow(2)


a %>% select(count) %>% map_dfr(.f=myfuncSingleRow) #output as expected    
a %>% select(count) %>% map_dfr(.f=myfuncMultipleRow) #output not as expected

现在这也不符合预期。例如myFuncMultipleRow,我期望前3行相等,接下来的3行相等,最后3行相同。使用myFuncMultipleRow的示例:

获取

  a b  c
1 1 1  1
2 2 4  8
3 3 9 27
4 1 1  1
5 2 4  8
6 3 9 27
7 1 1  1
8 2 4  8
9 3 9 27

想要:

  a b  c
1 1 1  1
2 1 1  1
3 1 1  1
4 2 4  8
5 2 4  8
6 2 4  8
7 3 9 27
8 3 9 27
9 3 9 27

和往常一样,我可能没有正确使用这些函数,但是这里有些卡住了-不想解决旧的循环和rbind,这可能是性能瓶颈。有参加者吗?

编辑:正如指出的那样,“ rep”中的“ each”参数可以解决这一问题,但不能解决主要问题。如果map确实进行了迭代,并为每个元素调用了函数,则对函数“ rep”使用参数“ each”和“ times”应产生相同的结果。传递给map的函数未向量化,但假设单个参数的长度为1。 解决方案需要这样做:

res<-data.frame()
for(i in a) res<-rbind(res,myfuncMultipleRow(i))

1 个答案:

答案 0 :(得分:0)

因此,在查看最新的purrr 0.3.0(在旧版本上)后,map_depth指向正确的方向。

a %>% select(count)%>% map_depth(.depth=2,.f=myfuncMultipleRow) %>%  map_dfr(.f=bind_rows)

拖放map_depth(),bind_rows()并嵌套:

a %>% select(count)%>% map_dfr(~map_dfr(.,myfuncMultipleRow))
a %>% select(count)%>% map_dfr(.f=function(x) map_dfr(x,.f=myfuncMultipleRow))