R — Применить функцию с 3 аргументами к каждой строке матрицы из 3 столбцов, используя в качестве аргументов каждое значение из 3 столбцов

#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)