1

我有一个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
  }

  })

我错过了什么?我怎样才能做到这一点?
谢谢!

4

2 回答 2

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)
于 2012-07-30T20:58:11.290 回答
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])))
于 2012-07-30T21:03:08.933 回答