2017-06-09 41 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