迭代列表中的数字向量

时间:2012-07-30 20:27:09

标签: r

我有一个数字向量列表NList,如

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

[[2]]
[1] 2280  2  13

[[3]]
[1] 15 4  13

[[4]]
[1] 2902  178   13

,结构就像

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).....)

我想迭代这个列表中的数字向量,我想做一些事情:

  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  

  })

但它不起作用并返回:

dim(X) must have a positive length

lapply对我不起作用并将总和返回为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
  }

  })

我错过了什么吗?我怎么能这样做?
谢谢!

2 个答案:

答案 0 :(得分:3)

我从你的apply语句中取出了这个函数,以便更接近它。

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

然后我可以使用以下函数将函数应用于每一行:

  list1 <- lapply(NList,f)

答案 1 :(得分:2)

好的,所以这段代码可行:

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)

或者你可以在一行中完成:

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