2017-02-27 4 views
1

私はすべて同じ構造のリストを持っており、2番目の層の各リストの1つの要素を変更したいと思います。言い換えれば、私はオブジェクトx、y & zを持つ単一のリストを持っています。このリストは別のリストで複数回繰り返されます。これらのリストのそれぞれをxに変更する必要があります。これを行う最善の方法は何ですか?lapplyでリストのリストを変更する

私の現在のアプローチは、私が望む変更を行い、リストを再作成する小さな関数を作成することです。しかし、これを行う簡単な方法があると私に思い出させる何かがありますか?

以下のコードは、私のおもちゃの例ではうまくいくアプローチを示していますが、実際のコンテキストはオブジェクトがより複雑なので、1つの値を変更するだけで何度も再作成する必要はありません。私はそれをこのようにすることができた、ちょうど畳み込まれて感じる。

l = list(x = 1:3, y = "a", z = 9) 
test = list(l, l, l) 

standardize = function(obj){ 
    obj$x = obj$x/max(obj$x) 
    list(obj$x, obj$y, obj$z) 
} 

lapply(test, function(e) standardize(e)) 

答えて

3

リストを再作成する代わりに、変更されたobjを返すだけです。

standardize = function(obj){ 
    obj$x <- obj$x/max(obj$x) 
    obj 
} 

ボーナス:objの要素の名前が保存されるようになりました。 purrrで

+0

大変感謝!今はちょっと馬鹿だと感じる! – SamPassmore

1

library(purrr) 

test2 <- test %>% map(map_at, 'x', ~.x/max(.x)) 

または

test2 <- test %>% map(update_list, x = ~x/max(x)) 

いずれかの方法は、あなたがあなたのリストのサイズは既に固定されているとして見

str(test2) 
## List of 3 
## $ :List of 3 
## ..$ x: num [1:3] 0.333 0.667 1 
## ..$ y: chr "a" 
## ..$ z: num 9 
## $ :List of 3 
## ..$ x: num [1:3] 0.333 0.667 1 
## ..$ y: chr "a" 
## ..$ z: num 9 
## $ :List of 3 
## ..$ x: num [1:3] 0.333 0.667 1 
## ..$ y: chr "a" 
## ..$ z: num 9 
0

を取得し、これはどこな状況であります単純なforループもタスクに適しています。

for(i in seq_along(test)){ 
    test[[i]]$x <- test[[i]]$x/max(test[[i]]$x) 
} 

Iクロックがこのlapplyソリューションよりも遅く単なる0.8ミリ秒であるとして。

関連する問題