0

I have a list of matrices constructed by the following loops:

 # Set up Row and Column Names for prediction coefficients.
    
    
    rows = c("Intercept", "actsBreaks0", "actsBreaks1","actsBreaks2","actsBreaks3","actsBreaks4","actsBreaks5","actsBreaks6",
                "actsBreaks7","actsBreaks8","actsBreaks9","tBreaks0","tBreaks1","tBreaks2","tBreaks3", "unitBreaks0", "unitBreaks1",
                "unitBreaks2","unitBreaks3", "covgBreaks0","covgBreaks1","covgBreaks2","covgBreaks3","covgBreaks4","covgBreaks5",
                "covgBreaks6","yearBreaks2016","yearBreaks2015","yearBreaks2014","yearBreaks2013","yearBreaks2011",
                "yearBreaks2010","yearBreaks2009","yearBreaks2008","yearBreaks2007","yearBreaks2006","yearBreaks2005",
                "yearBreaks2004","yearBreaks2003","yearBreaks2002","yearBreaks2001","yearBreaks2000","yearBreaks1999",
                "yearBreaks1998","plugBump0","plugBump1","plugBump2","plugBump3")
    cols = c("Value")
    
    #                           Build Matrix for dummy coefficient values.
    
    matrix1 <- matrix(c(1:48), nrow = 48, ncol = 1, byrow = TRUE, dimnames = list(rows,cols))
    matrix1
    
    #                           Extract each variable type into own matrix (i.e. all "actsBreaks{x}")
    #
    
        Beta_names     <- list()
        betabreaks     <- unique(gsub("[0-9]*", "", rows))
        for (bc in betabreaks)
        {
            Breaks     <- grep(paste0(bc, "[0-9]*"), rows)
            Beta_names[[bc]] <- matrix1[Breaks, ,drop = FALSE]
            Beta_names[[bc]] <- data.matrix(unlist(Beta_names[[bc]])) #, byrow = TRUE)
        }
    
    #                           Set up matrices for excluded/test data
    
    one_column <-c(1,1,2,3,3,3,4,4,4,4,4,5,6,9,9,8,7,5,4,7,7,8,2,0,10)
    two_column <-c(1,1,2,3,3,3,4,4,4,4,4,5,6,9,9,8,7,5,4,7,7,8,3,0,10)
    three_column <-c(1,1,2,3,3,3,4,4,4,4,4,5,6,9,9,8,7,5,4,7,7,8,4,10,0)
    four_column <-c(1,1,2,3,3,3,4,4,4,4,4,5,6,9,9,8,7,5,4,7,7,8,5,0,10)
    five_column <-c(1,1,2,3,3,3,4,4,4,4,4,5,6,9,9,8,7,5,4,7,7,8,6,0,10)
    six_column <-c(1,1,2,3,3,3,4,4,4,4,4,5,6,9,9,8,7,5,4,7,7,8,7,0,10)
    seven_column <-c(1,1,2,3,3,3,4,4,4,4,4,5,6,9,9,8,7,5,4,7,7,8,8,0,10)
    eight_column <-c(1,1,2,3,3,3,4,4,4,4,4,5,6,9,9,8,7,5,4,7,7,8,9,0,10)
    nine_column <-c(1,1,2,3,3,3,4,4,4,4,4,5,6,9,9,8,7,5,4,7,7,8,1,0,10)
    ten_column <-c(1,1,2,3,3,3,4,4,4,4,4,5,6,9,9,8,7,5,4,7,7,8,0,0,10)
    
    DF1 <- data.frame (one_column ,two_column ,three_column ,
                       four_column ,five_column ,six_column ,
                       seven_column ,eight_column ,nine_column ,
                                     ten_column )
    
    
    paralength   <- 5
        Xnames         <- list()
        datindc        <- 1
        while ( datindc <= paralength )
        { 
            Xbreaks    <- factor(DF1[[datindc]],levels=sort(unique.default(DF1[[datindc]]),decreasing=FALSE))
            Xnames[[datindc]] <- data.frame(model.matrix(~Xbreaks -1), stringsAsFactors = FALSE)
            datindc           <- datindc + 1
        }
    #
    Xlngth  <- length(Xnames)
        BtaXind <- 1
        BetaiXi <- list()
        while ( BtaXind <= Xlngth )
        {
            BetaiXi[[BtaXind]] <- (Beta_names[[BtaXind + 1]] * Xnames[[BtaXind]])
            BtaXind            <- (BtaXind + 1)
        }

I need to add each of those matrices' rows to each other, which I am trying to do by turning each matrix into a vector

BiXilngth <- length(BetaiXi)
    BetaiXiTr <- list()
    BtaiXiTrd <- 1
    while (BtaiXiTrd <= BiXilngth)
    {
        Var1                 <- c(t(BetaiXi[[BtaiXiTrd]]))
        BetaiXiTr[BtaiXiTrd] <- Var1
        BtaiXiTrd            <- BtaiXiTrd + 1
    }

and adding the vectors, effectively transposing the matrices. However, when I tried to convert the first matrix BetaiXi[[1]] to a vector and add it to the list with this command BetaiXiTr[BtaiXiTrd] <- c(t(BetaiXi[[BtaiXiTrd]])) I got the following message:

Warning message:
In BetaiXiTr[BtaiXiTrd] <- c(t(BetaiXi[[BtaiXiTrd]])) :
  number of items to replace is not a multiple of replacement length

I then tried using unlist():

> BetaiXiTr[BtaiXiTrd] <-unlist(c(t(BetaiXi[[1]])))
Warning message:
In BetaiXiTr[BtaiXiTrd] <- unlist(c(t(BetaiXi[[1]]))) :
  number of items to replace is not a multiple of replacement length

with the same result. Finally, I tried assigning the first vector to a variable > Var1 <- c(t(BetaiXi[[BtaiXiTrd]])) and assigning that vector to the list > BetaiXiTr[BtaiXiTrd] <- Var1 with, yet again, the same warning:

Warning message:
In BetaiXiTr[BtaiXiTrd] <- Var1 :
  number of items to replace is not a multiple of replacement length

I searched for the warning message to determine what exactly I was being warned of but ended being more confused. Most reproduce or encountered the error message by trying to replace a vector of so many elements with a vector of fewer, while (to my understanding) I am simply trying to add a vector to a list. Am I going about this the incorrect way?

PDiddyA
  • 59
  • 1
  • 8
  • I don't think you need to index your empty lists as `while` will take care of that, they will be in the list in the expected order, so try without `[BtaiXiTrd]` and similar on your list objects. – Chris Sep 08 '21 at 16:13
  • @Chris do you refer to something like this? `while (BtaiXiTrd <= BiXilngth) { Var1 <- c(t(BetaiXi[[BtaiXiTrd]])) BetaiXiTr <- Var1 BtaiXiTrd <- BtaiXiTrd + 1 }` – PDiddyA Sep 08 '21 at 16:25
  • @Chris What actually ended up working was changing `BetaiXiTr[BtaiXiTrd]` to `BetaiXiTr[[BtaiXiTrd]]`. It seems I still do not quite understand the differences between `[ ]` and `[ [ ] ]` – PDiddyA Sep 08 '21 at 16:31
  • 2
    `[` for vectors, `[[` for lists, rinse and repeat, as a mantra. Good luck with your study. – Chris Sep 08 '21 at 16:32

1 Answers1

0

I was using [ ] and [ [ ] ] incorrectly in BetaiXiTr[BtaiXiTrd]. It needs to be BetaiXiTr[[BtaiXiTrd]]and that allows the vectors to be added.

PDiddyA
  • 59
  • 1
  • 8