首页 > 解决方案 > 在 R 中,有没有办法循环遍历函数并将所有输出绑定到 1 个数据帧中?

问题描述

我有一个函数定义为:

Bestideas <- function(x) {
  Top_five = subset(Masterall, Masterall$Name == x) %>% slice(1:5)
  return(as.data.frame(Top_five))
}

然后,我想要一个包含给定列表中每个名称的“Bestideas”输出的数据框,因此我执行以下操作: 1. 创建一个空数据框。2.创建for循环直到绑定我函数中每个名称的输出:

bestideas_collection = data.frame()

for (i in MYLISTOFNAMES){
    bind_rows(bestideas_collection, Bestideas(i))
  } 

但是,我不断收到错误消息“较长的对象长度不是较短对象长度的倍数,较长的对象长度不是较短对象长度的倍数”

(没有插入两次,这是实际的错误信息)

如果这是可能的,任何人都可以帮助我吗?如果可以,我做错了什么?

标签: r

解决方案


您的示例应该可以工作,您忘记在循环中分配它:

bestideas_collection = data.frame()

for (i in MYLISTOFNAMES){
    bestideas_collection  <- bind_rows(bestideas_collection, Bestideas(i))
  } 

请在提问时举个例子。我给一个:

Masterall <- data.frame(Name = rep(LETTERS[1:5],each = 10),value = rnorm(50))
MYLISTOFNAMES <- c("A","B")

最好的用途是生成一个 data.frame 列表,您可以实际绑定bind_rows(或do.call(rbind, yourlist)在基础 R 中,或rbindlist在 中data.table):

lapply(MYLISTOFNAMES,Bestideas) %>%
  bind_rows()

因此,您不必创建循环更新的空 data.frame。您还可以使用mapfrom purr

purrr::map(MYLISTOFNAMES,Bestideas) %>%
  bind_rows()


   Name       value
1     A  1.19390555
2     A  1.20447637
3     A -0.78496237
4     A  0.27154501
5     A -0.02922748
6     B -0.47460937
7     B -2.09716169
8     B  0.06161554
9     B  1.55524055
10    B  0.75727887

推荐阅读