【问题标题】:How do Io apply my own function to matrices?如何将自己的函数应用于矩阵?
【发布时间】:2020-04-14 15:09:54
【问题描述】:

我是 R 的新手,我正在学习如何将自己的函数应用于矩阵。我写了以下代码:

HAR_ReV<-function(vec){
  name<-rlang::enexpr(vec)
  x<-vec
  ReV_d = ReV_w = ReV_m = NULL

  TT = length(x)
  for (i in 31:TT){
    ReV_d[i] = x[(i-1)]
    ReV_w[i] = sum(x[(i-7):(i-1)],na.rm = T)/7 
    ReV_m[i] = sum(x[(i-30):(i-1)],na.rm = T)/30 
  }
  Realized_Variances = cbind(ReV_d, ReV_w, ReV_m)
  colnames(Realized_Variances)= c(paste("ReV_d",name, sep = "_"), 
                                  paste("ReV_w",name, sep = "_"),
                                  paste("ReV_m",name, sep = "_"))
  Realized_Variances
}

代码是为应用于向量而编写的,上面的函数为每个向量创建一个大小为 3530(包括 NA)X 3 的新矩阵。现在,我有一个包含所有向量的矩阵,我想应用这个函数来获得一个大小为 3530 x 36 的矩阵。

我的矩阵结构如下:

Matrix<-matrix(1:45, nrow = 3530,   ncol = 12)
dimnames(Matrix) <- list(NULL, NULL)
dimnames(Matrix) <- list(c(1:3530), c("rrp_nsw_d", "rrp_qld_d"  , "rrp_sa_d", "rrp_vic_d",     "rrp_nsw_RV_pos", "rrp_qld_RV_pos", "rrp_sa_RV_pos", "rrp_vic_RV_pos", 
                      "rrp_nsw_RV_neg" , "rrp_qld_RV_neg", "rrp_sa_RV_neg", "rrp_vic_RV_neg"))

感谢您的帮助

【问题讨论】:

  • 请展示如何使用一个不会产生错误的向量调用此函数。
  • @Parfait ,对于单个向量,这将是代码 example&lt;-as.numeric(c(1:3530)),函数将是 HAR_ReV(example)

标签: r matrix


【解决方案1】:

考虑lapply 构建一个矩阵列表,然后您可以在最后将cbind 组合在一起。但是,要做到这一点,需要稍作调整。不要使用带有文字参数名称的rlang::enexpr 定义name,而是考虑将name 作为参数传递,例如原始矩阵列号。另外,提前定义你的向量长度,而不是在循环中增加它们:

调整功能

HAR_ReV <- function(vec, name){
  #name <- rlang::enexpr(vec)          # REMOVE LINE
  x <- vec
  TT <- length(x)
  # DEFINE VECTOR LENGTH IN ADVANCE (MORE EFFICIENT THAN GROWING THEM IN LOOP)
  ReV_d <- ReV_w <- ReV_m <- vector(mode="numeric", length=TT-30)

  for (i in 31:TT){
    ReV_d[i] <- x[(i-1)]
    ReV_w[i] <- sum(x[(i-7):(i-1)],na.rm = T)/7 
    ReV_m[i] <- sum(x[(i-30):(i-1)],na.rm = T)/30 
  }
  Realized_Variances <- cbind(ReV_d, ReV_w, ReV_m)
  colnames(Realized_Variances) <- c(paste("ReV_d", name, sep = "_"), 
                                    paste("ReV_w", name, sep = "_"),
                                    paste("ReV_m", name, sep = "_"))
  return(Realized_Variances)
}

矩阵构建

my_matrix <- matrix(1:45, nrow = 3530, ncol = 12,
                    dimnames = list(c(1:3530), 
                                    c("rrp_nsw_d", "rrp_qld_d"  , "rrp_sa_d", "rrp_vic_d",     
                                      "rrp_nsw_RV_pos", "rrp_qld_RV_pos", "rrp_sa_RV_pos", 
                                      "rrp_vic_RV_pos", "rrp_nsw_RV_neg" , "rrp_qld_RV_neg", 
                                      "rrp_sa_RV_neg", "rrp_vic_RV_neg")
                    )
)

# LIST OF MATRICES
final_matrix_list <- Map(function(i,n) HAR_ReV(my_matrix[,i], n), 
                         1:ncol(my_matrix), colnames(my_matrix))

# FINAL MATRIX
final_matrix <- do.call(cbind, final_matrix_list)

dim(final_matrix)
# [1] 3530   36

str(final_matrix)
# num [1:3530, 1:36] 0 0 0 0 0 0 0 0 0 0 ...
# - attr(*, "dimnames")=List of 2
# ..$ : NULL
# ..$ : chr [1:36] "ReV_d_rrp_nsw_d" "ReV_w_rrp_nsw_d" "ReV_m_rrp_nsw_d" "ReV_d_rrp_qld_d" ...

str(final_matrix)

【讨论】:

  • 我有一个问题。使用name &lt;- rlang::enexpr(vec) 允许我保留原始变量的名称。现在,final_matrix 中的名称已被数字替换,很难识别原始变量。您能否建议更改原始功能以恢复此信息?
  • 查看更新,将lapply 替换为Map(包装到mapply)以在矩阵列和相应列名之间运行元素循环。功能没有变化。
【解决方案2】:

以下将为您提供您正在寻找的结果:

result <- as.matrix(do.call("cbind", lapply(as.data.frame(Matrix), 
                                            function(x) {
                                              y <- as.integer(x); 
                                              HAR_ReV(y)
                                            })))

显然我无法将结果放入此处,但您可以查看结果的尺寸:

dim(result)
#> [1] 3530   36

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多