2017-02-23 7 views
0

私は、この質問がRの初心者のための素敵なチュートリアル(私のような)になることを願っています。 データ、アルゴリズムなどを操作するためにループが必要な言語をプログラミングすることに慣れていました。 しかし、Rのループは遅く、大きなデータの場合には見えます。 幸い、Rはbulit-in関数を提供しています。これにより、要素を反復処理したり、非常に効率的な方法で計算を行うことができます。ループを使わずにRを印刷する(適用する)

今、私は約lapplyおよび他の有用な機能を適用し、私はそう私が読んだR.内のデータをanalysyingてるときのループを避けるためにしたいと思います。

私のデータと印刷の最初の列と他の列との間の相関関係を作成したいと思います。ループなしのすべてのサンプル名、サンプル見積もり、およびP値。

私の考えは - stratchから偽のデータを作成します - :

md_stat <- apply(my_data[,2:4], 2, cor.test, my_data$surv, method="pearson") 

md_statがリストであるを適用

surv <- c(7.1,8,4,2,0.5,5,6) 
geneA_expr <- runif(n = 7, min = 1, max = 30) 
geneB_expr <- runif(n = 7, min = 1, max = 30) 
geneC_expr <- runif(n = 7, min = 1, max = 30) 
my_data <- data.frame(surv, geneA_expr, geneB_expr, geneC_expr) 

相関テストスタックオーバーフローで、手動でここにそれを見つけました今、私はそれをうまく視覚化したいと思いますが、どうすればいいのかわかりません。私にとっては複雑すぎるので、ループのためにを使用しました。

for(i in names(md_stat)){ 
    cat(i ,md_stat[[i]]$estimate, md_stat[[i]]$p.value, '\n') 
} 

geneA_expr 0.2517658 0.5860052 
geneB_expr 0.2438112 0.5982849 
geneC_expr 0.8026801 0.02977544 

上記のforループを他のbulit-in関数で置き換えるにはどうすればよいですか?

答えて

1

unlistmd_stat内のすべてのリスト。出力を行列にバインドします。

do.call(rbind, lapply(md_stat, unlist)) 
1

は、私がpurrrパッケージに依存して1そのうちあなたがこれを行うための4つの方法、を考えることができ、この

temp <- lapply(seq_along(md_stat), function(i) { 
    cat(names(md_stat)[[i]], md_stat[[i]]$estimate, md_stat[[i]]$p.value, '\n') 
}) 
1

を試してみてください。

ループを使用し、purrrパッケージから歩いて、lapplyと再帰関数を使用できます。

library(microbenchmark) 
library(purrr) 

surv <- c(7.1,8,4,2,0.5,5,6) 
geneA_expr <- runif(n = 7, min = 1, max = 30) 
geneB_expr <- runif(n = 7, min = 1, max = 30) 
geneC_expr <- runif(n = 7, min = 1, max = 30) 
my_data <- data.frame(surv, geneA_expr, geneB_expr, geneC_expr) 

md_stat <- apply(my_data[,2:4], 2, cor.test, my_data$surv, method="pearson") 


md_loop <- function(md_stat) { 
    for(i in names(md_stat)){ 
    cat(i ,md_stat[[i]]$estimate, md_stat[[i]]$p.value, '\n') 
    } 
} 

md_walk <- function(md_stat) { 
    walk(names(md_stat), function(i) { 
    cat(i ,md_stat[[i]]$estimate, md_stat[[i]]$p.value, '\n') 
    }) 
} 

md_apply <- function(md_stat) { 
    lapply(names(md_stat), function(i) { 
    cat(i[[1]],md_stat[[i[[1]]]]$estimate, md_stat[[i[[1]]]]$p.value, '\n') 

    }) 
} 

md_recursive <- function(md_stat) { 
    i <- names(md_stat) 

    if(length(i) < 1) { 
    NULL 
    } else { 
    cat(i[[1]],md_stat[[i[[1]]]]$estimate, md_stat[[i[[1]]]]$p.value, '\n') 
    md_recursive(tail(md_stat, -1)) 
    } 
} 

md_speed <- microbenchmark(
    md_loop(md_stat), 
    md_walk(md_stat), 
    md_apply(md_stat), 
    md_recursive(md_stat) 
) 

速度の比較 microbenchmark

関連する問題