2012-03-06 2 views
1

リストがあります。各要素は数値ベクトルです。各番号の範囲は0から1までですが、私は.95以上のものだけに興味がありますが、ベクター上での位置と他のすべての番号は、それぞれの位置を相対的にプロットする必要があります。複数レベルのリストの要素をループなしで置換する

l1 = list(c(runif(20)),c(runif(21)),c(runif(22)),c(runif(19))) 

ので、私はそうのようlapply用いて、0に等しい0.95以下のすべての数を設定しようとした:

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

これだけ入力リストとして要素の等しい数のリストを返す(AS 1つは期待される)が、各要素は単にゼロである。

ので、私はそうのようなforループでそれを試してみました:

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

をし、それが働きました。各要素は入力ベクトルと同じ長さであり、0だけ含まれ、それよりも大きい数値.95

誰かがなぜラッパーがうまくいかないのか説明できますか?私はforループを使わなくてもいいと思っています。なぜなら、私はそれらが遅いと信じられるようになり、私が実際に働いているデータセットはずっと大きくなっています。
いつものように、
すべてのヘルプは高く評価され、
乾杯、
デイビー

答えて

3

使用lapplyifelse:それは単に設定しているため、あなたのコードが機能しなかった理由を

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

ブリリアント。ジェームスとnograpesの両方に感謝! –

2

理由がありますxの値を返しますが、値そのものは返されませんでした。これはそれを修正するでしょう:

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

私はifelseがよりエレガントだと思います。

関連する問題