2017-02-23 40 views
0

我希望這個問題對於R中的初學者來說是很好的教程(比如我)。 我習慣於編程語言,其中循環是操作數據,算法等所必需的。然而,R中的循環很慢,在大數據的情況下可以看到。 幸運的是R提供了內置函數,可以迭代元素並以非常有效的方式進行計算。R中沒有循環的打印列表(適用)

現在我想避免循環,當我在analysying R.數據所以,我讀過有關lapply申請和其他有用的功能。

我想在我的數據的第一列和其他列之間進行關聯並打印:樣本名稱,樣本估計值和好的表格中的p值 - 對於循環,沒有的所有東西。

我的想法 - 從stratch製造假數據:

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_stat是一個列表,現在我想很好地想象它,但我不知道該怎麼做,這對我來說太複雜了,所以我用作爲循環

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 

如何通過其他引入函數替換上面的循環?

回答

1

unlistmd_stat每個列表。然後將輸出綁定到矩陣中。

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

試試這個

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

我能想到的4種方式爲你做到這一點,其中1的依賴於purrr包。

你可以使用一個循環,從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