【问题标题】:R loop with strings inside a data frame nameR循环在数据框名称中带有字符串
【发布时间】:2017-11-10 22:25:32
【问题描述】:

我想生成一个数据帧 hminput,其中包含来自不同较小数据帧(名为 frqAFR、frqAMR、.. 等,如下所示)的 3 个参数。因此,与其单独编写所有代码来提取每一列的三列,然后逐列绑定它们,然后逐行绑定,我想知道是否可以使用带有列表中字符串的 for 循环对其进行一些优化。

所以,到目前为止,这是我的想法:

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"]))
              }

但它会生成一个带有三个 NA 的 hminput 数据帧。 有什么想法吗?谢谢!

期望的输出:

hminput

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

【问题讨论】:

  • 我实际上并没有得到你的输入结构是什么样的,以及你在 for 循环中做了什么。但是,我觉得您需要rbind 中的hminput。像rbind(hminput, cbind(paste(g)..... ??我相信有更有效和更简单的方法来做到这一点。

标签: r string for-loop


【解决方案1】:

我们需要获取数据集对象的值。假设“listpop”字符串是 data.frame 对象名称,使用mget 获取list 中的值,然后将列“SNP”、“POP”、“MAF”和rbind 子集化为@ 987654324@元素

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

如果我们使用for 循环

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

如果我们正在寻找有效的解决方案,那么可以使用来自data.tablerbindlist

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

如果我们需要使用tidyverse

library(tidyverse)
mget(listpop) %>%
         map(~.[c("SNP", "POP", "MAF")] %>%
         bind_rows()

【讨论】:

  • 谢谢,成功了!! :D 我选择使用第一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多