更改列表中的每个向量

时间:2012-01-30 16:06:26

标签: r list

我对lapply函数的工作原理存在根本问题。我想在列表中对每个向量的每个成员进行分类。

我的清单:

s <- list(
  a = c(1, 20, 300), 
  b = c(1.1, 20.1, 300.1), 
  c = c(1.2, 20.2, 300.3)
)

我的分类功能:

classify <- function(n, peaks){
  which(abs(peaks-n)==min(abs(peaks-n)))
}

我的高峰:

peaks <- c(1.27350, 20.32662, 300.02650)

如果我自己classify s $ c,我会得到我期望的结果:

> sapply(s$c,classify,peaks)
[1] 1 2 3

但是当我尝试一次对所有载体进行分类时,我得到了这个:

> lapply(s,classify,peaks)
$a
[1] 3 //should be 1,2,3

$b
[1] 3 //should be 1,2,3

$c 
[1] 1 //should be 1,2,3

为什么我得到了我的结果?我如何得到我想要的结果?

3 个答案:

答案 0 :(得分:4)

怎么回合

> lapply(s,sapply,classify,peaks)
$a
[1] 1 2 3

$b
[1] 1 2 3

$c
[1] 1 2 3

答案 1 :(得分:2)

首先,一个样式点:使用which.min来查找最小值的位置。

classify <- function(n, peaks){
  which.min(abs(peaks-n))
}

其次,打破你的代码,看看发生了什么。

abs(peaks - s$a)   #3rd value is smallest
abs(peaks - s$b)   #3rd value is smallest
abs(peaks - s$c)   #1st value is smallest

这些指标是从lapply的电话中返回的内容。


根据你的评论,我猜你的问题是lapply会对矢量的每个元素起作用,当你真的想要调用它时只需要调用一次,因为classify已经被矢量化了。试试这个:

if(is.list(s)) lapply(s, classify, peaks = peaks) else classify(s, peaks)

答案 2 :(得分:1)

lapply(s, function(x) classify(x, peaks))会将s列表中的每个元素作为n传递给函数classify。 lapply(s, classify, peaks)将峰值作为n进行分类。