我正在使用我想要过滤的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
答案 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)
}