首页 > 解决方案 > 使用 R 循环提取和过滤数据列

问题描述

我是 R 的新手,非常感谢您的帮助。我有一个包含 5 列(fasta 文件和四个菌株)数据和 10 行的数据框。

     genome <- data.frame(fasta = rnorm(10), strain1 = rnorm(10), strain2 = rnorm(10), strain3 = rnorm(10), strain4 = rnorm(10))

我想使用循环将数据框分成两列(fasta 和 strainn),这样最后我将拥有 4 个单独的 csv 文件和 2 列数据。在每个文件中,我想过滤应变的列,即只有具有给定最大值(例如 0.5)的行在新数据帧中。到目前为止,我可以使用“function (x) NULL”创建数据帧,但是一旦添加了过滤函数,我就无法过滤或导出数据帧。如何过滤和导出文件?到目前为止,我的代码是。

nstrain <- ncol(genome)-1

dataframes <- lapply(1:nstrain, function(x) NULL)

  for (i in 1:nstrain) {
  dataframes[[i]] <- data.frame(genome$fasta, genome[i+1])
  }

dataframes

我想最终得到这样的数据框

> dataframes
[[1]]
   genome.fasta    strain1
1    1.04954754 0.2358870
2    0.20305724 0.4763678
3    1.04875114  0.3216317
4    0.05839317 0.2899819
5    0.54135630 0.0100254

[[2]]
   genome.fasta    strain2
1    0.20305724  0.3915370
2    1.04875114 0.3294302
3   -0.03065096 0.4339920
4    0.70639127 0.3092204
5    0.54135630  0.2708824
6   0.65988727 0.4862548

[[3]]
   genome.fasta    strain3
1    0.44547248  0.3196918
2    1.04954754  0.3320331
3    0.54135630  0.3039161

[[4]]
   genome.fasta     strain4
1    0.44547248  0.21858664
2   -0.03065096 0.23830566

您的帮助将不胜感激。谢谢你。

标签: rloopsdataframefilter

解决方案


如果您想为每个菌株编写单独的 csv,您可以使用lapply

lapply(seq_along(genome[-1]), function(x) {
    write.csv(subset(cbind(genome[1], genome[x+1]), genome[[x + 1]] < 0.6), 
       paste0('strain', x, '.csv'), row.names = FALSE)
})

这将在您的工作目录中为您提供文件等'strain1.csv''strain2.csv'


如果您想要返回数据框列表,您可以删除该write.csv部分并使用

data <- lapply(seq_along(genome[-1]),function(x) 
            subset(cbind(genome[1], genome[x+1]), genome[[x + 1]] < 0.6))

推荐阅读