2012-07-30 84 views
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 
    } 

    }) 

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

+3

让一个名为'list'的对象变得非常混乱e list()是一个函数。 – Seth 2012-07-30 20:31:42

+1

要'申请'在你想要的'?lapply'列表上。除此之外,我无法效仿你的榜样... – Justin 2012-07-30 20:31:42

+3

你能告诉我们更多关于你喜欢的结果,而不是如何去做。你的方法看起来非常不像R。 – 2012-07-30 20:31:59

回答

3

我把你的应用语句中的函数看得更近了一点。

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) 
+0

谢谢!真的行。我想知道为什么我的方法不起作用。或者你能否指点我一些关于R中矢量化的材料? – Seen 2012-07-30 21:02:32

+2

我最喜欢的矢量化来源是http://www.burns-stat.com/pages/Tutor/R_inferno.pdf圈3。 – Seth 2012-07-30 21:15:53

+0

非常感谢您的参考。 – Seen 2012-07-31 03:56:27

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]))) 
+0

它看起来非常好...非常感谢您的答案。 – Seen 2012-07-30 21:03:50