2017-10-29 1 views
3

リストがあり、リストの要素を順番に(1つずつ)選択し、関数にプラグインしたいとします。ここで私は各要素を手動で接続するコードです。 apply機能を使用したり、forループを使用せずに自動的にどうすればいいですか?つまり、[[1]]を選択してから[[2]]を選択する方法です。Rの中でapplyとforループなしでリストの要素を順番に選択する方法

mu1 <- list(2,3,4) 
sd1 <- list(0.5,0.6,0.7) 
w <- c(0.5,0.2,0.3) 
set.seed(123) 
mylist <- list(rnorm(10,mu1[[1]],sd1[[1]]), 
rnorm(10,mu1[[2]],sd1[[2]]), 
rnorm(10,mu1[[3]],sd1[[3]])) 
ta <- list(c(0.5,0.6,0.7,0.4,0.3,0.5,0.65,0.2,0.9,0.1),c(0.4,0.6,0.7,0.2,0.3,0.5,0.65,0.2,0.8,0.3), 
      c(0.3,0.2,0.7,0.4,0.3,0.5,0.25,0.2,0.6,0.4)) 
xx <- sum(ta[[1]]*(log(w[1])+dnorm(mylist[[1]],log=T)),ta[[2]]*(log(w[2])+dnorm(mylist[[2]],log = T)),ta[[3]]* 
     (log(w[3])+dnorm(mylist[[3]],log = T))) 

答えて

4

我々は

lst <- vector('list', length(ta)) 
for(i in seq_along(ta)) { 
    lst[[i]] <- sum(ta[[i]]*(log(w[i])+dnorm(mylist[[i]],log=TRUE))) 

} 
xx1 <- sum(unlist(lst)) 
identical(xx, xx1) 
#[1] TRUE 

それともこれは* 'taの' と使用matrix

xx2 <- sum(do.call(rbind, ta)*(log(w)+ dnorm(do.call(rbind, mylist), log = TRUE))) 
identical(xx, xx2) 
#[1] TRUE 
4

に 'マイリスト' に変換することによって行うことができforループを使用することができます適用関数、特にmapplyを使用すると、次のことができます。

yy <- sum(mapply(function(x, y, z) x * (log(y)+dnorm(z,log=T)), ta, w, mylist)) 
yy 
[1] -89.6547 

これらが同じであることを確認します。

identical(yy, xx) 
[1] TRUE 
関連する問題