【问题标题】:Creating dataframe in R loop and naming it在 R 循环中创建数据框并命名
【发布时间】:2016-11-09 01:54:06
【问题描述】:

我正在处理 5 个要过滤的数据框(如果它们与正则表达式匹配,则删除一些行)。因为所有数据框都相似,具有相同的变量名称,所以我将它们存储在一个列表中并对其进行迭代。但是,当我想为每个原始数据帧保存过滤后的数据时,我发现它创建了一个 i_filtered(而不是 dfName_filtered),因此每次循环运行时,它都会被覆盖。 这是我在循环中的内容:

for (i in list_all){
  i_filtered1 <- i[i$chr != filter1,]
  i_filtered2 <- i[i$chr != filter2,]
  #Write the result filtered table in a csv file
  #Change output directory if needed
  write.csv(i_filtered2, file="/home/tama/Desktop/i_filtered.csv")
}

正如我所说,filter1 和 filter2 只是我用来过滤 chr 列中的数据的正则表达式。 将原始名称+“_filtered”分配给新数据框的正确方法是什么?

提前致谢

编辑添加信息: 每个数据框都有这些变量(但值可以改变)

chr     start   end    length
chr1    10400   10669   270
chr10   237646  237836  191
chrX    713884  714414  531
chrUn   713884  714414  531
chr1    762664  763174  511
chr4    805008  805571  564

我已将它们全部存储在一个列表中:

list_all <- list(heep, oe, st20_n, st20_t,all)
list_all <- lapply(list_all, na.omit)

过滤器:

#Get rid of random chromosomes
filter1=".*random"
#Get rid of undefined chromosomes
filter2 = "ĉhrUn.*

我正在寻找的输出是:

heep_filtered1
heep_filtered2
oe_filtered1
oe_filtered2
etc

【问题讨论】:

标签: r list loops dataframe filtering


【解决方案1】:

一种可能性是遍历一系列索引(或名称),而不是遍历数据框列表本身,并使用索引访问数据框。

另一个问题是!= 运算符不支持正则表达式。它只进行精确的文字匹配。您需要改用grepl()

names(list_all) <- c("heep", "oe", "st20_n", "st20_t", "all")

filtered <- NULL
for (i in names(list_all)){
    df <- list_all[[i]]
    df.1 <- df[!grepl(filter1, df$chr), ]
    df.2 <- df[!grepl(filter2, df$chr), ]
    #Write the result filtered table in a csv file
    #Change output directory if needed
    write.csv(df.2, file=paste0("/home/tama/Desktop/", i, "_filtered.csv"))
    filtered[[paste0(i, "_filtered", 1)]] <- df.1
    filtered[[paste0(i, "_filtered", 2)]] <- df.2
}

结果是一个名为filtered 的列表,其中包含过滤后的数据帧。

【讨论】:

  • 感谢您的回复,我已经添加了更多信息。
  • @TamaraDominguezPoncelas 我扩展了答案。
  • 感谢欧内斯特。我现在必须修改正则表达式,因为它们并没有完全按照我的要求做,但是这段代码确实可以正确地迭代并创建新的 df 和文件。
【解决方案2】:

问题是i 仅在单独时才被特别解释。您将其用作其他名称的一部分,并用作当前版本中的字符。

我建议命名列表,然后使用 lapply 而不是 for 循环(请注意,我还更改了过滤器以一步发生,因为现在不清楚您是要同时尝试将两者都取出还是不是——这也使得添加更多过滤器变得更容易)。

filters <- c(".*random", "chrUn.*")
list_all <- list(heep = heep
                 , oe = oe
                 , st20_n = st20_n
                 , st20_t = st20_t
                 , all = all)
toLoop <- names(list_all)
names(toLoop) <- toLoop # renames them in the output list


filtered <- lapply(toLoop, function(thisSet)){
  tempFiltered <- list_all[[thisSet]][!(list_all[[thisSet]]$chr %in% filters),]
  #Write the result filtered table in a csv file
  #Change output directory if needed
  write.csv(tempFiltered, file=paste0("/home/tama/Desktop/",thisSet,"_filtered.csv"))

  # Return the part you care about
  return(tempFiltered)
}

【讨论】:

  • 谢谢马克,我试过了,但由于某种原因,它没有保存新的 csv 文件。
猜你喜欢
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 2014-11-22
  • 1970-01-01
相关资源
最近更新 更多