2012-03-06 3 views
1

Итак, у меня есть список, каждый элемент которого является числовым вектором. Каждое число колеблется от 0 до 1, и меня интересуют только те, которые больше 0,95, но я должен сохранять их положение на векторе и все остальные числа, поскольку мне нужно построить их позиции относительно друг друга.Замена элементов многоуровневого списка без цикла

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(i in 1:length(l1)) 
{ 
    l1[[i]][l1[[i]]<.95]=0 
} 

и работал. Каждый элемент имеет ту же длину, что и входной вектор, и содержит только 0s и числа, которые больше .95

Может кто-нибудь объяснить, почему лапсет не работал. Я бы предпочел не использовать цикл for, поскольку мне кажется, что они медленнее, и реальный набор данных, над которым я работаю, намного больше.
Как всегда,
вся помощь оценена,
Cheers,
Дэви

ответ

3

Использование lapply и ifelse:

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

Блестящий. Спасибо и Джеймсу, и нотам !!! –

2

Причина, почему ваш код не работает, потому что это просто установить x, что вы хотите, но не вернули значение. Это исправить:

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

Я думаю, что ifelse будет более изящным, хотя.

Смежные вопросы