Разделить столбцы или вектор для передачи в функцию Purrr - PullRequest
1 голос
/ 12 марта 2020

У меня есть созданная функция веб-очистки, которая получает данные из API. Я передаю столбец df, который у меня есть, одному из аргументов функции в функции веб-очистки. Проблема, с которой я столкнулся, состоит в том, что URL-адрес занимает до 500 номеров в одном из параметров, а у моего df есть 2000 строк.

Как бы я разделил строки на 500, чтобы передать значения в функцию?

Я создал очень простое c представление, которое показывает рабочий процесс того, что я собираюсь сделать. Я хочу передать столбец split df в функцию анализа. Я предполагаю, что мне нужно было бы обернуть JSON разбор с map_dfr

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)

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Если нам нужно разделить data.frame на list из data.frame, можно указать group_split с gl

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))
0 голосов
/ 12 марта 2020

Возможные дубликаты здесь.

Тем временем вы можете разбить ваш 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 строки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...