2012-01-06 72 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 ... 

我想要替換所有的值由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.5我不知道可不可以我使用其中一個應用函數?或者對於這種類型的數據集(數組列表),還是應該保留循環方法並忘記其他選項?

回答

9

隨着可再生的數據:

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) {x[x < 1.5] <- 0; x}) 

的匿名函數一個相當有條理的方法,由dickoa提供:

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

我不是「大」的粉絲「;」使用R,但它的作品。所以我只需使用「ifelse」添加此解決方案:lapply(數據集,函數(x)ifelse(x <1.5,0,x))。 – dickoa 2012-01-06 09:46:02

+0

你爲什麼不喜歡用「;」。是否需要特定的資源? – 2012-01-06 11:07:54

+0

這裏只是語法,用分號我可以把它全部放在一行上,它只是懶惰 - 更好地將匿名函數放在更好的佈局中,但不知何故意味着它們不應該是匿名的(對我來說)。 ifelse是一個很好的整理。 – mdsumner 2012-01-06 13:40:55