Seen
Seen

Reputation: 4194

Iterate a numeric vector in a list

I have a list NList of numeric vector like

[[1]]
[1] 1959 9 4 62

[[2]]
[1] 2280  2  13

[[3]]
[1] 15 4  13

[[4]]
[1] 2902  178   13

and the structure is like

list(c(1959, 13), c(2280, 178, 13), c(2612, 178, 13), c(2902, 
178, 13), c(2389, 178, 13), c(216, 736, 13), c(2337, 178, 13), 
    c(2639, 2126, 13), c(2924, 676, 178, 13), c(2416, 674, 178, 
    13), c(2223, 13), c(842, 178, 13), c(2618, 1570, 178, 13), 
    c(854, 178, 13), c(1847, 178, 13), c(2529, 178, 13), c(511, 
    178, 13), c(2221, 736, 13), c(415, 674, 178, 13), c(2438, 
    178, 13), c(2127, 178, 13), c(1910, 2126, 13), c(1904, 674, 
    178, 13), c(2310, 674, 178, 13), c(1732, 178, 13), c(1843, 
    178, 13), c(2539, 178, 13), c(1572, 676, 178, 13), c(1616, 
    876, 13).....)

I want to iterate the numeric vectors in this list, I would like to do something as:

  sum<- 0
  index<-1
  list1 <- apply(NList,1,function (i){
  #I want to get each of the numeric vector here
  row <- NList[i]

  #then I want to iterate the numeric vector for some calculation.
  #I am expecting, for [[1]], I get f(1959,9)+f(9,4)+f(4,62), in which f is my customized function, below I use a simple multiple as example
  for (j in (1:(length(row)-1)))
  {
    origin <- row[j]
    dest <- row[j+1]
    #a simple calculation example...I am expecting an array of sum which is the calculation result 
    sum[index] <- sum[index] + origin*dest
  }
  index <- index+1  

  })

but it does not work and returns:

dim(X) must have a positive length

The lapply is not working for me and return sum as 0...

listR1 <- lapply(NList,function (i){
  row <- i
  for (j in 1:length(row))
  {origin <- row[j]
  dest <- row[j+1]
  sum[index] <- sum[index] + origin*dest
  }

  })

Did I miss something? How can I do this?
Thanks!

Upvotes: 1

Views: 2922

Answers (2)

Seth
Seth

Reputation: 4795

I took the function out of your apply statement to look at it a bit closer.

    f=function(Row) 
    {
     Sum<- 0
      for (j in 1:(length(Row)-1)  )
      {
            Sum<- j + Row[j]*Row[j+1]
      }
     Sum    # returns the Sum
    }

Then I can apply the function to each row with:

  list1 <- lapply(NList,f)

Upvotes: 3

nograpes
nograpes

Reputation: 18323

Okay, so this code would work:

f=function(a,b) sum(a,b)

test.func=function (i){
  for (j in 1:(length(i)-1))
    ret.val[j]=f(i[j],i[j+1])  
  ret.val
}

# Use lapply for a list.
lapply(NList,test.func)

Or you could do it in one line:

lapply(NList,apply(seq_along(i)[-length(i)],function(x) f(i[x],i[x+1])))

Upvotes: 2

Related Questions