如何解决R-将3个参数函数应用于3列矩阵的每一行,并使用3列的每个值作为参数
我有一个getSentiment函数(来自“ edgar” R包),该函数为我提供了具有一组度量的数据框,其工作原理如下:
getSentiment(cik.no = "cik_number",form.type = "form_type",filing_year = year)
该功能不适用于矢量,因此我无法使用C(“ cik_number1”,“ cik_number2”)来检查多个cik编号,这对于表单类型和申请年份都是相同的。 在我这边,我有700多家公司的矩阵,其中有3列,一列为Cik编号,一列为表格类型,最后一列为申请年份。 我想要的是将getSentiment函数应用于矩阵的每一行/观测,以3列中每行的对应值作为参数。 然后,为完成此操作,我想按照执行顺序将每个公司获得的所有数据框都整理到一个大矩阵中。
也许解决方法很简单,所以我从5月开始学习R,但是我无法理解。 如果有人可以帮助我,那将非常好,因为我正在从事的工作是针对我的硕士论文。
谢谢
解决方法
假设您的数据称为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]]))
,
如果生成带有矩阵行索引的向量,则可以将其用作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],3]))
res
#> c1 c2 c3
#> 1 1 8 21
#> 2 2 10 24
#> 3 3 12 27
由reprex package(v0.3.0)于2020-09-19创建
针对您的功能,将其更改为:
res <- purrr::map_dfr(number_row,~getSentiment(cik.no[.x,form.type[.x,filing_year[.x,3]))
(假设数据中cik.no
,form.type
和filing_year
的顺序)
您可以在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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。