[R] Remove specific rows from nested list of matrices

MacQueen, Don m@cqueen1 @end|ng |rom ||n|@gov
Fri Nov 2 20:53:05 CET 2018


It appears that at the bottom of the nesting, so to speak, you have a character matrix.
That is, the contents of the [[1]][[1]][[1]] element is a character matrix that, according to the row and column labels, has 4 rows and 5 columns.
However, the matrix itself, as printed, has, apparently, 4 column in row one, not 5 -- and five quote marks in row 4, so the number of columns is ambiguous (quote marks have to be balanced).

None the less, assuming you really do have character matrices that you're trying to modify, I'd be inclined to take a brute force approach.

I would also use for() loops instead of lapply(), because the code will be easier to follow.

Do you know, or can you assume, the maximum depth of nesting? Let's say it's three.

Here's an outline. I can't test it without an actual object to work on, and it probably has some details wrong. My intent is to present the concept.
(I believe I have the 'next' statements in the right place...)

for (i1 in length(FF)) {
  ## the "1" in "ff1" means first level of nesting, not first element of the list
  ff1 <- FF[[i1]]

  if ( !is.list(ff1) ) {
     ## the current element is not nested list
     {apply the function that removes the appropriate rows}
      ## this 'next' statement is supposed to move us to the 2nd element of FF
     next
  } else {
    ## the current element (of FF) is a list, therefore, have to loop through its elements

  for (i2 in length(ff1)) {
     ff2 <- ff1[[i2]]

     if ( !is.list(ff2) ) {
        ## the current element is not a nested list
        {apply the removal function}
        next
        } else {
        ## the current element is a nested list
       for (i3 in length(ff2) {
      ## if I've kept track correctly, we're now looking at the third level down of nesting,
      ## and if that's the max depth, we don't have to go any further

---- etc, and close all the loops ---


This brute force approach consists of nested for() loops.
The outer loop is for the top level list.
The next nested loop is for the second level lists, within each element of the top level
The next nested loop is for the third level lists, within each second level element
Since not all elements are nested to the same depth, it has to be noticed when a non-list element is reached. That element gets modified and that level is done; move up to the previous level and continue to its next element.
At least, that's an approach that I think can work, but getting all the details correct will take some work.

--
Don MacQueen
Lawrence Livermore National Laboratory
7000 East Ave., L-627
Livermore, CA 94550
925-423-1062
Lab cell 925-724-7509
 
 

On 11/2/18, 8:00 AM, "R-help on behalf of Ek Esawi" <r-help-bounces using r-project.org on behalf of esawiek using gmail.com> wrote:

    Hi All,
    
    I have a list that is made up of nested lists, as shown below. I want
    to remove all rows in each sub-list that start with an empty space,
    that’s the first entry of a row is blank; for example, on
    [[1]][[1]][[1]] Remove row 4,on [[1]][[1]][[3]] remove row 5, on
    [[1]][[2]][[1]] remove row 6, etc.. All rows start with 2 digits/ 2
    digits. My formula works on individual sublist but not the whole
    list.. I know my indexing is wrong, but don’t know how to fix it.
    
    
    > FF
    
    [[1]]
    [[1]][[1]]
    [[1]][[1]][[1]]
    [,1]    [,2]   [,3]    [,4] [,5]
    [1,] "30/20"   "AAAAAAAA" “    “   "-89"
    [2,] "02/20"   "AAAAAAAA” “    “   "-98"
    [3,] "02/20"   “AAAAAAA” “    “   "-84"
    [4,] “  “ “  “   “
    [[1]][[1]][[2]]
    [,1]    [,2]
    [1,] "02/23" “AAAAAAAA” : 29" “
    [2,] "02/23" “AAAAAAAA” ." “
    [3,] "02/23" “AAAAAAAA” " “
    [4,] "02/23" “AAAAAAAA” "
    [[1]][[1]][[3]]
    [,1]    [,2]    [,3] [,4] [,5] [,6] [,7]
    [1,] "01/09" “AAAAAAAA"    “   “   “   "53"
    [2,] "01/09" “AAAAAAAA” "   “   “   “   "403"
    [3,] "01/09" “AAAAAAAA” "   “   “   “   "83"
    [4,] "01/09" “AAAAAAAA” "   “   “   “   "783"
    [5,] “  “  “AAAAAAAA”  3042742181"   “   “   “   “
    [[1]][[2]]
    [[1]][[2]][[1]]
    [,1]  [,2] [,3] [,4] [,5]
    [1,] “    “   “   “   “AAAAAAAA” "
    [2,] "Standard Purchases"  “   “   “   "
    [3,] "24/90 "AAAAAAAA” “   "243"  "
    [4,] "24/90 "AAAAAAAA” "   "143"  "
    [5,] "24/91 "AAAAAAAA” " “   "143" “
    [6,] “    “   “   “   "792"
    [[1]][[2]][[2]]
    [,1]    [,2]
    [1,] "02/23" “AAAAAAAA”: 31" “
    [2,] "02/23" “AAAAAAAA”." “
    [3,] "02/23" “AAAAAAAA” " “
    [4,] "02/23" “AAAAAAAA”
    [5,] "02/23" “AAAAAAAA”
    [6,] "02/23" “AAAAAAAA” 20"
    [7,] "02/23" “AAAAAAAA”  “
    [8,] "02/23" “AAAAAAAA” "33"
    [[1]][[3]]
    [[1]][[3]][[1]]
    [,1]    [,2]
    [1,] "02/23" “AAAAAAAA”: 28" “
    [2,] "02/23" “AAAAAAAA”." “
    [3,] "02/23" “AAAAAAAA” " “
    [4,] "02/23" “AAAAAAAA” "
    [[1]][[3]][[2]]
    [,1]    [,2]    [,3]    [,4] [,5] [,6] [,7]    [,8]    [,9]
    [1,] "02/23" “AAAAAAAA” " “   “   "53" "
    [2,] "02/24" “AAAAAAAA” " “   “   "
    [3,] “  “  “  “   “   “   “  “  "1,241"
    [4,] "02/24" "AAAAAAAA”  “   "33”
    
    My Formula,:
    
    G <- lapply(FF, function(x) lapply(x, function (y) lapply(y,
    function(z)  z[grepl("^[0-9][0-9]/",z[,1]),])))
    
    The error: Error in z[, 1] : incorrect number of dimensions
    
    
    
    Thanks in advance--EK
    
    ______________________________________________
    R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
    https://stat.ethz.ch/mailman/listinfo/r-help
    PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
    and provide commented, minimal, self-contained, reproducible code.
    



More information about the R-help mailing list