在没有循环的情况下替换多级列表的元素

时间:2012-03-06 15:05:05

标签: r

所以我有一个列表,每个元素都是一个数字向量。每个数字的范围从0到1,我只对那些大于.95的数字感兴趣,但我必须保持它们在矢量上的位置,以及所有其他数字,因为我需要相对于彼此绘制它们的位置。 / p>

l1 = list(c(runif(20)),c(runif(21)),c(runif(22)),c(runif(19)))

所以我尝试将所有低于0.95的数字设置为等于0,使用lapply如下:

l1 = lapply(l1, function(x){x[x<.95]=0})

但这只返回一个相等数量的元素列表作为输入列表(正如人们所期望的那样),但每个元素只是零。

所以我尝试使用for循环:

for(i in 1:length(l1))
{
  l1[[i]][l1[[i]]<.95]=0
}

这很有效。每个元素的长度与输入向量相同,并且仅包含0和大于.95

的数字

有人可以解释为什么lapply不起作用。我不想使用for循环,因为我被认为它们更慢,而我正在处理的真实数据集要大得多。
一如既往,
所有的帮助表示赞赏,
干杯,
戴维

2 个答案:

答案 0 :(得分:3)

使用lapplyifelse

lapply(l1,function(x) ifelse(x<0.95,0,x))

答案 1 :(得分:2)

你的代码不起作用的原因是因为它只是将x设置为你想要的,但没有返回值本身。这会解决它:

lapply(l1, function(x) {x[x<.95]=0;x})

我认为ifelse会更优雅。