在R循环中创建数据框并命名它

时间:2016-07-06 21:03:12

标签: r list loops dataframe filtering

我正在使用我想要过滤的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列中数据的正则表达式。 分配原始名称+&#34; _filtered&#34;的正确方法是什么?到新的数据框架?

提前致谢

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

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

2 个答案:

答案 0 :(得分:2)

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

另一个问题是!=运算符不支持正则表达式。它只做精确的文字匹配。您需要改为使用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的列表,其中包含已过滤的数据帧。

答案 1 :(得分:1)

问题是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)
}