#r #function #apply
#r #функция #применить
Вопрос:
У меня есть функция getSentiment (из пакета «edgar» R), которая предоставляет мне фрейм данных с набором мер, который работает следующим образом:
getSentiment(cik.no = "cik_number", form.type = "form_type", filing_year = year)
Эта функция не работает с векторами, поэтому я не могу проверить несколько номеров cik, используя C («cik_number1», «cik_number2»), то же самое для типа формы и года подачи.
На моей стороне у меня есть матрица из более чем 700 компаний с 3 столбцами: один для номеров cik, один для типа формы и последний для года подачи.
Я хочу применить функцию getSentiment к каждой строке / наблюдению матрицы, принимая в качестве аргумента соответствующее значение каждой строки, присутствующей в 3 столбцах.
Затем, чтобы завершить это, я хотел бы повторно связать все фреймы данных, которые я получил для каждой компании, в 1 большую матрицу, в порядке их выполнения.
Возможно, решения просты, я начал изучать R в мае, но я не могу добраться до него. Если кто-нибудь может мне помочь, это было бы здорово, поскольку то, над чем я работаю, предназначено для моей магистерской диссертации.
Спасибо
Ответ №1:
Предполагая, что ваши данные вызваны data
и столбец находится в порядке cik.no
, form.type
и filing_year
вы можете попробовать следующее.
result <- do.call(rbind, apply(data, 1, function(x)
getSentiment(cik.no = x[1], form.type =x[2], filing_year = x[3])))
И аналогично это решение с использованием Map
должно работать.
result <- do.call(rbind, Map(getSentiment, data[[1]], data[[2]], data[[3]]))
Комментарии:
1. Большое спасибо, а также другим, кто ответил так быстро, решение с использованием Map было лучшим.
Ответ №2:
Если вы создаете вектор с индексами строк вашей матрицы, вы можете использовать его в качестве входных данных для функции map_dfr
из purrr
пакета. Эта функция применяет предоставленную функцию к каждому элементу предоставленного вектора (здесь ваш индекс строки) и связывает результирующий data.frame.
test_mat <- matrix(1:9, ncol = 3)
test_fun <- function(a, b, c) {
data.frame(c1 = a,
c2 = 2 * b,
c3 = 3 * c)
}
number_row <- seq_len(nrow(test_mat))
res <- purrr::map_dfr(number_row, ~test_fun(test_mat[.x, 1],
test_mat[.x, 2],
test_mat[.x, 3]))
res
#> c1 c2 c3
#> 1 1 8 21
#> 2 2 10 24
#> 3 3 12 27
Создано 2020-09-19 пакетом reprex (версия 0.3.0)
Для вашей функции измените ее на:
res <- purrr::map_dfr(number_row, ~getSentiment(cik.no[.x, 1],
form.type[.x, 2],
filing_year[.x, 3]))
(Предполагая порядок cik.no
form.type
и filing_year
в ваших данных)
Ответ №3:
Вы можете использовать pmap
функцию в tidyverse purrr
пакете. Выходные данные будут представлять собой список возвращаемых матриц из вашей функции. Затем вы можете rbind
объединить выходные данные:
library(tidyverse)
paramlist <- list(cik.no, form.type, filing.year) # the parameters are vectors
outputs <- pmap(paramlist, getSentiment)
final <- do.call(rbind, outputs)