R语言中matrix函数与管道操作报错:未使用参数及dimnames问题排查
R语言代码报错排查求助
我在运行Coursera免费课程《Using R for Regression and Machine Learning in Investment》中的两段代码时均出现报错,具体情况如下:
第一段代码及报错
betas <- betas %>% matrix(data= models, nrow = 5, ncol = num_factors +1, byrow = T, dimnames = list) %>% data.frame(row.names = FAANG)%>% colnames(betas) <- c("Constant", "Mkt_RF", "SMB", "HML", "RMW", "CMA")
报错信息:
Error in matrix(., data = models, nrow = 5, ncol = num_factors + 1, byrow = T, : unused argument (.)
我并未在data参数前添加.符号,对此感到困惑。
第二段修改后的代码及报错
betas <- betas %>% matrix(unlist(models),nrow = num_factors, ncol = num_factors +1, byrow = T) %>% data.frame(row.names = FAANG)%>% colnames(betas) <- c("Constant", "Mkt_RF", "SMB", "HML", "RMW", "CMA")
报错信息:
Error in matrix(., unlist(models), nrow = num_factors, ncol = num_factors + : 'dimnames' must be a list
课程提供的原始代码也无法正常运行,恳请帮忙排查问题。
问题分析与修正方案
第一段代码错误原因
管道符%>%会自动将左侧的对象(这里是betas)作为第一个参数传递给下一个函数(matrix),但你显式指定了data=models,导致matrix同时收到了管道传递的.和data=models两个参数,而matrix函数没有名为.的参数,因此报错。第二段代码错误原因
matrix函数的第一个参数是待转换的向量,你把unlist(models)放在了第二个位置,管道传递的.变成了第一个参数,参数顺序完全错误;- 管道末尾不能直接使用
colnames(betas) <- ...这种赋值语句,管道传递的对象无法被这种赋值操作正确接收; nrow设置为num_factors不合理,FAANG是5家公司,对应5行回归结果,所以nrow应该是5。
修正后的代码示例
假设models是包含5个回归模型的列表(对应FAANG每家公司的因子回归),可以按以下方式处理:
# 提取所有模型的系数 beta_coefs <- lapply(models, coef) # 转换为矩阵并设置维度名称 betas_matrix <- matrix(unlist(beta_coefs), nrow = length(FAANG), ncol = num_factors + 1, byrow = TRUE, dimnames = list(FAANG, c("Constant", "Mkt_RF", "SMB", "HML", "RMW", "CMA"))) # 转换为数据框 betas <- as.data.frame(betas_matrix)
如果一定要用管道写法,可以调整为:
betas <- models %>% lapply(coef) %>% unlist() %>% matrix(nrow = length(FAANG), ncol = num_factors + 1, byrow = TRUE, dimnames = list(FAANG, c("Constant", "Mkt_RF", "SMB", "HML", "RMW", "CMA"))) %>% as.data.frame()
内容的提问来源于stack exchange,提问作者Chern Hong Pang
相关产品推荐
相关产品推荐

