【问题标题】:Split a dataframe or matrix into multiple parts using assign in a loop使用循环分配将数据帧或矩阵拆分为多个部分
【发布时间】:2019-11-23 12:27:23
【问题描述】:

我有一个矩阵,由 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],])
  }
}

...

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

错在哪里?

【问题讨论】:

  • 删除j 循环并创建一个years &lt;- 2004:2018 变量,您在assign 调用中使用years[i]

标签: r matrix split


【解决方案1】:

您可以将数据存储在列表中,而不是在全局环境中创建多个对象。您可以将矩阵转换为数据框,然后使用split

df <- as.data.frame(Sigma.ma)
temp <- split(df, gl(nrow(df)/12, 12))

这将为您提供可以使用temp[[1]]temp[[2]] 等访问的数据框列表。

使用可重现的示例,

mat <- matrix(1:100, 10)
df <- as.data.frame(mat)

split(df, gl(nrow(df)/2, 2))

#$`1`
#  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
#1  1 11 21 31 41 51 61 71 81  91
#2  2 12 22 32 42 52 62 72 82  92

#$`2`
#  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
#3  3 13 23 33 43 53 63 73 83  93
#4  4 14 24 34 44 54 64 74 84  94
#....
#....

【讨论】:

    【解决方案2】:

    这样的东西应该可以工作

    years <- 2004:2018
    
    for(i in 1:length(years)) {
    
      start_row <- (i - 1) * 12 + 1
      end_row <- start_row + 11
    
      assign(paste0("Sigma.ma", years[i]), Sigma.ma[start_row:end_row, ])
    
    }
    

    【讨论】:

      【解决方案3】:

      也许您可以尝试sapply() 而非assign(),如下所示:

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

      【讨论】:

        【解决方案4】:

        另一种方法是将矩阵转换为 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))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-19
          • 1970-01-01
          • 2021-08-17
          • 1970-01-01
          • 2019-07-29
          • 1970-01-01
          • 2014-03-29
          • 2013-11-16
          相关资源
          最近更新 更多