所以我是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
(或其任何版本)来替换上面的示例代码?
答案 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的大小(和随之而来的内存重新分配)比任何关于你的代码本质上都是循环的。