我有一个从数据库中获取一些数据的函数。它采用单个参数并返回一个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))
答案 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))