English 中文(简体)
提高效率:从名单中挑选候选人
原标题:More efficient way:selecting vec from a list

假定

x = c(1, 2, 3.5, 4, 6, 7.5, 8, 9, 10, 11.5, 12) 
y = c(2.5, 6.5) 
I = split(x, findInterval(x, y))
f = function(vec, x) {
        d = pmax(outer(x, vec, "-"), 0)
        colSums(d - d^2/2)
}

I want to calculate the value of f(I[[i]], x) in each values of each interval and then find which I[[i]] actual value has the maximum value of f(I[[i]], x ) in each interval. Is there any other way which is more efficient than this for loop:

for (i in 1:length(I)) {
    max.values[[i]] = I[[i]][which.max(f(I[[i]], x))]
}

这是我想要取得的结果:

 > max.values
 [1]  2  6 10
最佳回答

如果你只是想去掉 for。 您可以用一点来取代它。 :

max.values <- unlist( lapply( I, function(v) v[which.max(f(v, x))] ) );

This will only make a difference if length(I) is large. To gain more performance, see if you can simplify f(.) just for the purpose of finding a max. For best optimization, you should consider re-writing the performance critical part in C, C++, or Fortran.

R can be horribly slow when the data vector gets large, when a lengthy loop exists, or when the available data structures are not suited for the task. Just as an anecdote, I wrote a "for-loop"-less R code that was killed after 2 weeks of Wall time (input array: n ~ 1e6). (The R code runs fine on input with n ~ 1e4). A C++ equivalent code took 1 min. A slightly more optimized C++ code took 10 seconds...

问题回答

你可以做些什么。

mapply( [ , I, lapply(lapply(I, f, x), which.max))
# 0  1  2 
# 2  6 10

下面是中间步骤:

lapply(I, f, x)
# $`0`
# [1] -190.875 -142.375
# 
# $`1`
# [1] -85.75 -70.75 -26.75
# 
# $`2`
# [1] -9.500 -6.125 -1.625  0.375  0.375  0.000

lapply(lapply(I, f, x), which.max)
# $`0`
# [1] 2
# 
# $`1`
# [1] 3
# 
# $`2`
# [1] 4

这更是紧凑的,但我不知道它是否更有效率。

v <- sapply(lapply(I,f,x=x),which.max)
mapply(getElement,I,v)




相关问题
Finding a class within list

I have a class (Node) which has a property of SubNodes which is a List of the Node class I have a list of Nodes (of which each Node may or may not have a list of SubNodes within itself) I need to be ...

How to flatten a List of different types in Scala?

I have 4 elements:List[List[Object]] (Objects are different in each element) that I want to zip so that I can have a List[List[obj1],List[obj2],List[obj3],List[obj4]] I tried to zip them and I ...

How to remove unique, then duplicate dictionaries in a list?

Given the following list that contains some duplicate and some unique dictionaries, what is the best method to remove unique dictionaries first, then reduce the duplicate dictionaries to single ...

Is List<> better than DataSet for UI Layer in ASP.Net?

I want to get data from my data access layer into my business layer, then prepare it for use in my UI. So i wonder: is it better to read my data by DataReader and use it to fill a List<BLClasses&...

What is the benefit to using List<T> over IEnumerable<T>?

or the other way around? I use generic lists all the time. But I hear occasionally about IEnumerables, too, and I honestly have no clue (today) what they are for and why I should use them. So, at ...

灵活性:在滚动之前显示错误的清单

我有一份清单,在你滚动之前没有显示任何物品,然后这些物品就显示。 是否有任何人知道如何解决这一问题? 我尝试了叫人名单。

Converting Dictionary to List? [duplicate]

I m trying to convert a Python dictionary into a Python list, in order to perform some calculations. #My dictionary dict = {} dict[ Capital ]="London" dict[ Food ]="Fish&Chips" dict[ 2012 ]="...

热门标签