применить функцию для списка массивов - PullRequest
2 голосов
/ 06 января 2012

Это вопрос новичка, но у меня возникли некоторые проблемы с пониманием функций применения для наборов данных, представляющих собой список массивов.

Это пример данных, которые у меня есть, и что я пытаюсьdo:

> dataset1=array(data1,dim=c(2,10,5))
> dataset2=array(data2,dim=c(2,10,5))
> dataset3=array(data2,dim=c(2,10,5))
> datasets=list(data1=dataset1,data2=dataset2,data3=dataset3)
> str(datasets)
List of 3
 $ data1: num [1:2, 1:10, 1:5] 0.101 1.192 0.154 0.911 1.889 ...
 $ data2: num [1:2, 1:10, 1:5] 2.84 1.63 1.78 1.24 1.09 ...
 $ data3: num [1:2, 1:10, 1:5] 2.84 1.63 1.78 1.24 1.09 ...

Я хочу заменить все значения ниже 1.5 на 0

for (d in 1:3){
  for (n in 1:2){
    for (i in 1:10){
      datasets[[d]][n,i,][datasets[[d]][n,i,]<=1.5]=0
    }
  }
}

Интересно, могу ли я использовать одну из функций применения?Или для этого типа набора данных (список массивов), или я должен сохранить метод цикла и забыть о других параметрах?

1 Ответ

9 голосов
/ 06 января 2012

С воспроизводимыми данными:

dataset1 = array(rnorm(100),dim = c(2,10,5))
dataset2 = array(rnorm(100),dim = c(2,10,5))
dataset3 = array(rnorm(100),dim = c(2,10,5))
datasets = list(data1 = dataset1, data2 = dataset2, data3 = dataset3)

Теперь напишите анонимную функцию для выполнения общей замены и примените ее по всему списку:

datasets.updated <- lapply(datasets, function(x) {x[x < 1.5] <- 0; x})

Более аккуратный подход дляанонимная функция, предоставляемая dickoa:

datasets.updated <- lapply(datasets, function(x) ifelse(x < 1.5, 0, x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...