У меня есть тиббл с двумя столбцами. Для каждой строки я хочу использовать значения из двух столбцов в функции. Как правильно это сделать, используя tidyverse
? Как я опишу более подробно ниже, я не думаю, что функция (вызов API) может быть векторизована.
Чтобы сформулировать идеи, предположим, что у меня есть следующие данные:
library(tidyverse)
d <- tibble(a=c("a", "b", "d"), b=c("x", "y", "z"))
Затем я хочу применить функцию (здесь это очень простая вещь). Используя базу R, я могу сделать:
for (i in 1:nrow(d)) {
d[i, "value"] <- paste0(d[i,"a"], d[i, "b"])
}
Каков наилучший способ — tidyverse
решение ожидается, но не обязательно — сделать это для каждой строки, передав функции два аргумента?
Обратите внимание: я знаю, что в приведенном выше примере я мог бы сделать d <- d %>% mutate(value = paste0(a, b))
, однако моя реальная проблема связана с функцией R, которая выполняет вызов API к определенному API, который, по моему мнению, необходимо запускать по одной строке за раз. Каждый вызов API возвращает список, который я хочу сохранить в своем тиббле.
Также обратите внимание, что мне может потребоваться небольшая задержка между каждым вызовом API.
Отлично, спасибо! Я просто пытаюсь использовать пакет rscopus
с его функциями, такими как get_complete_author_info
. У меня есть список имен и фамилий, которые я бы передал в качестве аргументов функции.
Прежде всего проверьте, не векторизован ли он еще. Например, paste()
есть, поэтому цикл не нужен. С помощью base можно сделать довольно много вещей, функции, на которые стоит обратить внимание: do.call, mapply, Map, vapply, lapply, apply, уменьшить. Этот список явно не полный.
Хорошие мысли - спасибо!
Используйте rowwise
, map2_chr
, mapply
или Vectorize
:
# 1
library(dplyr)
f <- paste # replace with your function
d %>%
rowwise %>%
mutate(value = f(a, b)) %>%
ungroup
# 2 - replace map2_chr with map2_dbl if output of f is double
library(dplyr)
library(purrr)
d %>% mutate(value = map2_chr(a, b, f))
# 3
library(dplyr)
d %>% mutate(value = mapply(f, a, b))
# 4
library(dplyr)
d %>% mutate(value = Vectorize(f)(a, b))
Либо
library(dplyr); d %>% rowwise() %>% mutate(res = paste(c_across(a:b), collapse = ""))
, либо основание Rtransform(d, res = apply(d, 1, \(x) paste(x["a"], x["b"], collapse = "")))
. Более подробные ответы могут быть возможны при наличии дополнительной информации об его реальных намерениях или знаниях об API. Без этого вы, скорее всего, получите много догадок...