Замена элементов многоуровневого списка без цикла - PullRequest
1 голос
/ 06 марта 2012

Итак, у меня есть список, каждый элемент которого представляет собой числовой вектор. Каждое число колеблется от 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, вот так:

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

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

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

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Используйте lapply и ifelse:

lapply(l1,function(x) ifelse(x<0.95,0,x))
2 голосов
/ 06 марта 2012

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

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

Я думаю, что ifelse будет более элегантным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...