【问题标题】:R: How to loop a query to avoid a server (BOLD) overloadR:如何循环查询以避免服务器(BOLD)过载
【发布时间】:2020-12-02 19:55:11
【问题描述】:

我是一名在家工作的一年级博士生,在大流行期间依靠最少的支持。感谢您在这个主题上的指导。

-我有一个名为spsp 的数据框。在这个数据框中,我有一个名为 BOLDQUERY 的列(或变量),其长度为 7030 个物种名称或观察值 (spsp$BOLDQUERY)

-我要查询的服务器叫BOLD。这类似于 NCBI,但适用于条形码。 (library(bold))

但 BOLD 服务器在重载之前一次只接受 100 个查询,并且不返回任何查询。

我想将 BOLDQUERY 变量分成 100 个观察值的块,然后将我的查询结果中的表格打印到 BOLD 服务器。

例如用于观察 1 到 100

spspbold1.100 <- tbl_df(bold_specimens(taxon = spsp$BOLDQUERY[1:100], geo = "Italy"

write.csv2(spspbold1.100, "spsp1.100.csv", row.names=FALSE)

但要涵盖所有观察结果,这意味着将变量 BOLDQUERY 拆分为 aprox(7030/100) 71 个片段并输入范围 71 次。

必须有一个循环可以避免重新键入范围 71 次, 你将如何循环这个过程? 我非常感谢您在正确方向上的指导。 我是 R 的初学者。

非常感谢!


这样做的效率低下:

手动输入和拆分 BOLDQUERY 到 100 个观察的位,直到我达到 7030,或至少 7000

library(bold)

library(tidyverse)

spspbold1.100 <- tbl_df(bold_specimens(taxon = spsp$BOLDQUERY[1:100], geo = "Italy"))

write.csv2(spspbold1.100, "spspbold1.100.csv", row.names=FALSE)

.

69 次

.

.

spspbold6901.7000 <- tbl_df(bold_specimens(taxon = spsp$BOLDQUERY[6901:7000], geo = "Italy"))

write.csv2(spspbold6901.7000 "spspbold6901.7000.csv", row.names=FALSE)

在我想要创建的循环中

我想查询相同的范围,例如: 1到100, 101 到 200, 201 到 300, . . . 直到 7030。

然后定义:

k<- 1 

j<- 0:round(n/100) #0 to 70

l<- 1:ceiling(n/100) #1 to 71

library(tidyverse)

##number of observations in BOLDQUERY

n <- as.numeric(spsp %>% 
  select(BOLDQUERY) %>% 
  summarise(
    n()
  ))

1:100 和范围的下限和上限可以根据以下等式表现

-下限方程(ll = k*1 +100j)

在哪里 1 = 1*(k=1) +100(j=0),其中 k=1(始终)且 j 的范围为 [0;round(n/100)]

-上限方程(ul = 100*l)

例如 100 100 = 100(l=1) 其中 l=j+1


如何循环播放?

for ( i to j?????)

{
spspbold**ll**.**ul** <- tbl_df(bold_specimens(taxon = spsp$BOLDQUERY[ll:ul], geo = "Italy"))

write.csv2(spspbold**ll**.**ul**, "spspBOLD**ll**.**ul**.csv", row.names=FALSE)
}

我很感激!

【问题讨论】:

    标签: r loops for-loop server range


    【解决方案1】:

    这是一个设置批量大小并在查询批次之间暂停 R 的示例方法。这应该提供一个框架来构建解决方案,因为无法复制查询。 na.omit 用于删除最后一组查询的空白值,比确定最后一批大小更容易。

    df1 <- data.frame(n = seq_len(7030),
                      y = runif(5))
    
    batch_size <- 100
    batches <- ceiling(nrow(df1) / batch_size)
    
    df2 <- data.frame() # empty data.frame to load results
    
    for(i in seq_len(batches)) {
      print(na.omit(df1[seq_len(batch_size) + (i - 1) * batch_size, ])) # for illustrative purposes
      df2 <- rbind(df2, na.omit(df1[seq_len(batch_size) + (i - 1) * batch_size, ]))
      Sys.sleep(60) # adjust as needed to not overload the server
    }
    

    确认循环批量构建等效的data.frame

    > setequal(df1, df2)
    [1] TRUE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多