【问题标题】:Split columns or vector to pass to Purrr Function拆分列或向量以传递给 Purrr 函数
【发布时间】:2020-03-12 16:30:08
【问题描述】:

我创建了一个从 API 获取数据的网络抓取功能。我将df 列传递给网络抓取函数中的函数参数之一。我遇到的问题是 URL 在其中一个参数中最多占用 500 个数字,而我的 df 有 2000 行。

如何将行拆分为 500 以便将值传递给函数?

我创建了一个非常基本的表示,它显示了我想要做的工作流程。我想将拆分的 df 列传递给 parse 函数。我猜我需要用map_dfr 包装JSON 解析

library(tidyverse)

sample_df <- tibble(id = 1:20,
             col_2 = rnorm(1:20)) 

# parse function
parse_people <- function(ids = c("1", "10"), argument_2 = NULL){
  # Fake Base Url
  base_url <- "https://www.thisisafakeurl.com/api/people?Ids="

  # fix query parameters to collapse Ids to pass to URL
  ids<- stringr::str_c(ids, collapse = ",")

  url <- glue::glue("{base_url}{ids}")

  # Get URL
  resp <- httr::GET(url)

  # Save Response in JSON Format
  out <- httr::content(resp, as = "text", encoding = "UTF-8")

  # Read into JSON format.  
    jsonlite::fromJSON(out, simplifyDataFrame = TRUE, flatten = TRUE)

}


sample_parse <- parse_people(sample_df$id)

我想我可能需要创建 2 个函数。 1 个解析数据的函数,以及一个基于拆分使用 map_dfr 的函数。

类似:

# Split ID's from DF here.  I want blocks of 500 rows to pass below

# Map Split ID's over parse_people
ids %>% 
map_dfr(parse_people)

【问题讨论】:

  • 你能检查一下我的解决方案吗

标签: r tidyverse purrr


【解决方案1】:

如果我们需要将data.frame拆分成listdata.frame,一个选项是group_splitgl

library(dplyr)
n <- 3
lst1 <- sample_df %>% 
          group_split(grp = as.integer(gl(n(), n, n())), keep = FALSE) %>%
          map(pull, id)

并将其传递给函数

map(lst1, ~ parse_people(ids = .x))

【讨论】:

  • 我更新了我的问题/示例。基本上我试图从 id 中拆分行以传递给 map_dfr。
  • 如何将值作为 id 传递给 map_dfr 函数? IE。 parse_people(ids =) 在解析函数中。
  • @Jazzmatazz 试试map(lst1, ~parse_people(ids = .x))
【解决方案2】:

Possible duplicate here.

同时,您可以通过以下方式将 20 行数据帧拆分为 5 个数据帧,每行 4 行:

sample_df <- tibble(id = 1:20,
                    col_2 = rnorm(1:20)) 

split(sample_df, rep(1:5, each = 4))

然后您可以将生成的数据帧列表传递给 purrr 函数。

编辑:如果您事先不知道总行数,想按给定数字拆分,但还包括所有行,链接中还有另一种解决方案:

chunk <- 3
n <- nrow(sample_df)
r  <- rep(1:ceiling(n/chunk),each=chunk)[1:n]
d <- split(sample_df,r)

这里我想要 3 个块,但它将包括所有行(列表中的最后一个数据框有 2 行)

【讨论】:

  • 如果我的 df 中要拆分的行数不均匀怎么办?我想除以 500,但包括所有行。
  • 我用另一个解决方案修改了答案。
  • 我更新了我的问题/示例。基本上我试图从 id 中拆分行以传递给 map_dfr。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多