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

标签 r dplyr tidyverse purrr

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

我尝试了以下路线:

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))

最佳答案

因此,在查看最新的 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))

关于r - 在 vector/data.frame 列上应用返回 data.frame/tibble 的函数并绑定(bind)结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54826837/

相关文章:

r - 填补缺失的水平

恢复 R 中时间序列的线性滤波器

r - 连接多个数据框时使用数据框名称作为后缀

r - 结束日期与开始日期之间的日期差异

r - 通过具有不同 ID 值的列扩展 R 中的数据框

r - 为什么 R 中的 h2o.randomForest 比 randomForest 包做出更好的预测

r - ggplot2 中的字体大小困惑

r - 如何对字符串变量使用 cut 函数?

r - 苦苦思索如何在我的函数中合并基于 Vector 的数据帧行的重新排序

将.csv读入嵌套列表并设置元素名称