2017-06-09 40 views
1

我想用不同的較小數據框(名爲frqAFR,frqAMR,..等,如下所示)中的3個參數生成數據幀hminput。所以,我沒有單獨編寫所有代碼來提取每個列的三個列,然後按列綁定它們,然後逐行綁定,我想知道是否可以用列表中的字符串對for循環進行優化。帶數據幀名稱內的字符串的R循環

所以,這裏是我的想法至今:

listpop<-c("frqAFR","frqAMR","frqEUR","frqEAS","frqSAS","frqAFROURU","frqIND") 


for (g in listpop) { 
    hminput<- rbind(cbind(paste(g)["SNP"],paste(g)["POP"],paste(g)["MAF"])) 
       } 

但它產生三個NAS上hminput數據幀。 有什麼想法?謝謝!

所需的輸出:

hminput 

snp1 pop1 maf1 
snp2 pop2 maf2 
snp3 pop3 maf3 
... 
+0

我實際上並沒有得到你正在做它在換你的輸入結構像什麼循環。不過,我覺得你需要'rbind'中的'hminput'。就像'rbind(hminput,cbind(paste(g).....'??我確信有更高效和簡單的方法來做到這一點。 –

回答

1

我們需要得到的數據集對象的值。假設「listpop」字符串是data.frame對象名稱,使用mget,則子集列「SNP」,「POP」,「MAF」,並rbindlist元素

hminput <- do.call(rbind, lapply(mget(listpop), function(x) x[c("SNP", "POP", "MAF")])) 
得到一個 list

如果我們使用的是for循環

hminput <- c() 
for(g in listpop) { 
    hminput <- rbind(hminput, get(g)[c("SNP", "POP", "MAF")]) 
} 

如果我們正在尋找有效的解決方案,然後rbindlistdata.table可用於

library(data.table) 
rbindlist(lapply(mget(listpop), `[`, c("SNP", "POP", "MAF"))) 

如果我們需要使用tidyverse

​​
+1

謝謝,它工作!!:DI選擇使用第一個。 – melunuge92