如何为列表中每个矩阵元素统一设置列名?R语言代码求助
解决列表中矩阵统一设置列名的问题
我明白你的问题啦!你原来的代码之所以会把列表元素变成列名向量,是因为lapply会收集匿名函数的返回值,而你之前的函数里只做了列名赋值操作——这个操作本身返回的就是你设置的列名向量,并没有把修改后的矩阵返回回去,所以最后得到的列表全是列名,而不是带列名的矩阵。
给你两种简单的解决办法:
方法1:匿名函数中返回修改后的矩阵
在设置列名之后,把矩阵x明确返回,这样lapply就会收集到修改后的矩阵了:
unemp <- c(1:10) bsp_li <- list(c(1:10),c(11:20),c(21:30)) var_data_rep <- lapply(bsp_li, function(x) {cbind(as.numeric(x), as.numeric(unemp))} ) # 正确的列名设置代码 var_data_rep2 <- lapply(var_data_rep, function(x) { colnames(x) <- c("rGDP", "U") # 用<-做赋值更符合R的规范 x # 必须返回修改后的矩阵 })
方法2:用函数式赋值写法(更简洁)
R里的赋值操作其实可以作为函数来用,colnames<-就是一个函数,我们可以直接把它传给lapply,省去写匿名函数的麻烦:
var_data_rep2 <- lapply(var_data_rep, `colnames<-`, c("rGDP", "U"))
验证一下,现在你打印var_data_rep2[[1]],就能看到带正确列名的矩阵了:
> var_data_rep2[[1]] rGDP U [1,] 1 1 [2,] 2 2 [3,] 3 3 ...
之后你就可以基于统一的列名来拟合模型了,比如批量跑线性回归:
# 批量拟合U~rGDP的线性模型 models <- lapply(var_data_rep2, function(mat) { lm(U ~ rGDP, data = as.data.frame(mat)) }) # 查看第一个模型的结果 summary(models[[1]])
内容的提问来源于stack exchange,提问作者yaennu
相关产品推荐
相关产品推荐

