使用循环分配将数据框或矩阵分成多个部分

我有一个矩阵,其中包含2004年至2018年的月度值。我想将其拆分并保存为带有相应月份的各个年份。像这样

...

Sigma.ma2004 <- Sigma.ma[1:12,]
Sigma.ma2005 <- Sigma.ma[13:24,]
Sigma.ma2006 <- Sigma.ma[25:36,]
Sigma.ma2007 <- Sigma.ma[37:48,]
Sigma.ma2008 <- Sigma.ma[49:60,]
Sigma.ma2009 <- Sigma.ma[61:72,]
Sigma.ma2010 <- Sigma.ma[73:84,]
Sigma.ma2011 <- Sigma.ma[85:96,]
Sigma.ma2012 <- Sigma.ma[97:108,]
Sigma.ma2013 <- Sigma.ma[109:120,]
Sigma.ma2014 <- Sigma.ma[121:132,]
Sigma.ma2015 <- Sigma.ma[133:144,]
Sigma.ma2016 <- Sigma.ma[145:156,]
Sigma.ma2017 <- Sigma.ma[157:168,]
Sigma.ma2018 <- Sigma.ma[169:180,]

...

我试图为此创建一个循环。

...

start_var <- seq(from = 1,to = 169,by = 12)
end_var <- seq(from = 12,to = 180,by = 12)

for (i in 1:length(start_var)){
  for(j in 2004:2018){
    assign(paste("Sigma.ma",j,sep=""),Sigma.ma[start_var[i]:end_var[i],])
  }
}

...

保存了各个部分,但所有部分都具有相同的奇怪值。

错误在哪里?

ainiliyua 回答:使用循环分配将数据框或矩阵分成多个部分

您可以在列表中存储数据,而不是在全局环境中创建多个对象。您可以将矩阵转换为数据框,然后使用>>> max_pair = max(stats.items(),key=lambda i : i[1][1]) >>> print(max_pair[0],max_pair[1][1]) a 2000

split

这将为您提供可以使用df <- as.data.frame(Sigma.ma) temp <- split(df,gl(nrow(df)/12,12)) temp[[1]]等访问的数据帧列表。

使用可复制的示例

temp[[2]]
,

类似的事情应该起作用

coord_cartesian(ylim = c(0,0.12)) 
,

也许您可以像下面这样在sapply()上尝试assign()

sapply(2004:2018,function(k) assign(paste0("Sigma.ma",toString(k)),Sigma.ma[(k-2004)*12 + (1:12),]))
,

另一种方法是将矩阵转换为3D阵列。

n_years <- 3
start_year <- 2004
n_rows <- 5

set.seed(123)
Sigma.ma <- matrix(sample(100,n_years * n_rows * 12,replace = T),nrow = n_rows)

array(Sigma.ma,dim = c(n_rows,12,n_years))
本文链接:https://www.f2er.com/3045885.html

大家都在问