2012-01-06 7 views
2

これは初心者の質問ですが、配列のリストであるデータセットの適用関数を理解する上で問題があります。配列リストの適用関数

これは私が持っているデータの一例であり、私は何をしようとしています:

> 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

:匿名関数の

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

かなり整然とアプローチ:

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) 

今の一般的な交換を行うための匿名関数を書き、lapplyリスト越えているとディコア提供:

datasets.updated <- lapply(datasets, function(x) ifelse(x < 1.5, 0, x)) 
+1

私は ";"の大ファンではありません。 Rを使っていますが、うまくいきます。だから私はちょうど "ifelse"を使用してこのソリューションを追加します:lapply(datasets、function(x)ifelse(x <1.5、0、x))。 – dickoa

+0

なぜ ";"を使いたくないのですか?それは特定のresaonのためですか? –

+0

これは単なる構文で、セミコロンで1行にすることができます。匿名の関数をレイアウトに入れたほうがはるかに優れていますが、何とか匿名ではないという意味です。 ifelseは素敵な整頓です。 – mdsumner