2012-03-06 91 views
1

所以我有一個列表,其中的每個元素都是數字向量。每個數字的範圍是從0到1,我只對那些大於.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,數字大於0.95

有人可以解釋爲什麼lapply不起作用。我寧願不必使用for循環,因爲我認爲它們比較慢,而我正在處理的真實數據集要大得多。
一如往常,
所有幫助表示讚賞,
乾杯,
戴維

回答

3

使用lapplyifelse

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

輝煌。感謝James和nograpes !!! – 2012-03-06 15:21:39

2

之所以你的代碼沒有工作是因爲它只是設置x到你想要的,但沒有返回值本身。這將修復它:

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

我認爲ifelse會更優雅,但。