Reputation: 4194
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
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
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