R - 对使用'应用'的基本理解而不是嵌套循环

时间:2014-04-07 15:40:48

标签: r performance for-loop nested apply

所以我是R的新手(我来自Python背景),我仍然遇到一些问题,了解如何/何时实现apply函数(lapply,sapply,rapply等)而不是嵌套循环。

作为一个例子,假设你想要执行一些函数FUN,它将list的每个元素与另一个列表的每个元素进行比较。我会写下以下内容:

n = 1
m = 1
sameList = NULL
for(i in 1:length(list1)){
    for(j in 1:length(list2)){
        if(list1[n]==list2[m]){
            sameList<-c(sameList, list1[n]}
    n = n+1
    }
m = m+1
}

换句话说,一些嵌套循环遍历每个列表的每个元素。

我所学的是,在循环中连接列表是R中非常低效的过程,这就是使用apply的原因。

那么如何使用apply(或其任何版本)来替换上面的示例代码?

2 个答案:

答案 0 :(得分:7)

要使用lapply,您需要运行:

sameList = lapply(list1, function(x) lapply(list2, function(y) if (x==y) x else NULL))

答案 1 :(得分:0)

对于这种特殊情况,我会使用

sameList <- intersect(list1, list2)

此外,R中的术语表示我们将vector用于一种类型的集合;允许list包含不同的类型。

避免循环可能是一个美学问题,因为与apply相比,循环的性能比以前更好 - 但是你注意到的性能下降可能更多是因为不断改变sameList的大小(和随之而来的内存重新分配)比任何关于你的代码本质上都是循环的。