R Io如何将自己的函数应用于矩阵?
我是R的新手,正在学习如何将自己的函数应用于矩阵。我编写了以下代码:R Io如何将自己的函数应用于矩阵?,r,matrix,R,Matrix,我是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 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
}
HAR\u ReV考虑lappy
建立一个矩阵列表,然后在最后一起cbind
。然而,要做到这一点,需要稍作调整。而不是用<代码> rLang::EnExpR./COD>来定义名称,考虑文本参数名称,将传递名称作为参数,如原始矩阵列编号。此外,请提前定义向量长度,而不是在循环中增加向量:
调整后的功能
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)
}
HAR_ReV以下内容将为您提供所需的结果:
result请说明如何使用一个不会产生错误的向量调用此函数。@Parfait,对于单个向量,这就是代码example我有一个问题。使用name参见更新将lappy
替换为Map
(包装到mappy
)在矩阵列和相应列名之间运行元素循环。功能不变。
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)