首页 > 解决方案 > 使用 lapply 过滤多个数据集

问题描述

我正在尝试从数据框中过滤掉行并将生成的较短数据框写入新文件。我可以处理单个文件,但是尝试使用 lappy 在多个文件上运行此过程(并为输出文件提供不同的名称)证明很麻烦。

我试图根据“aaSeqCDR3”中的值是否包含“_”或“*”来过滤掉行

到目前为止,我有:

productseq <-function(x){
#establish filter criteria
filter <- c("\\*", "_")
#Filter data set to new variable
df2 <- df[!grepl(paste(filter, collapse = "|"), df$aaSeqCDR3),]
write.delim(df2, "df2.txt", sep= " ")}

但是试图将其应用于包含多个数据框名称(名称)的向量

nameproduct <- lapply(names, productiveseq)

我得到错误:

UseMethod(“filter_”)中的错误:没有适用于“filter_”的方法应用于“character”类的对象

我现在很迷茫,如果有任何见解,我将不胜感激。

下面是一个示例数据框:

ID  allDHitsWithScore   allJHitsWithScore   allCHitsWithScore   aaSeqCDR3
0   290 0.031402274 TGTGCCAGCGGCAGCCCCAATTCACCCCTCCACTTT    CASGSPNSPLHF
1   168 0.018191662 TGTGCTCTGAGTGATCAGAATAAGGGCAGGAGAGCACTTACTTTT   CALSDQNKGRRALTF
2   49  0.005305902 TGTGCAGTCTCCAAAGCTGCAGGCAACAAGCTAACTTTT CAVSKAAGNKLTF
3   16  0.001732539 TGCAGTGCTAGAGGGCGCTTAGCCAAAAACATTCAGTACTTC  CSARGRLAKNIQYF
4   15  0.001624256 TGTGCCTGAAGGAATGCAGGCAAATCAACCTTT   CA*RNAGKSTF
5   14  0.001515972 TGCAGTGCTAGAGTTGGACAGGGAGGGTTCTTC   CSARVGQGGFF
6   13  0.001407688 TGTGCCAGCAGTTACTTGGGACAGGGGGGAAACATTCAGTACTTC   CASSYLGQGGNIQYF
7   12  0.001299404 TGTGCCAGCAGTTTATGGGACTAGCGGGGGGTTCGAGCTCCTACAATGAGCAGTTCTTC CASSLWD*RG_SSSYNEQFF

标签: rfilteringlapply

解决方案


因为您传递的是数据框名称的字符向量,而不是数据框对象本身,所以get请在函数内部使用。

另外,请注意您正在写入同一个文件df2.txt,因此每次迭代都会覆盖同一个文件。要解决此问题,请将x字符值粘贴到文本文件名。并确保返回数据帧而不是NULLwrite.delim函数的最后一行调用。

productseq <- function(x) {
    # Retrieve data frame
    df <- get(x)

    # Establish filter criteria
    filter <- c("\\*", "_")

    # Filter data set to new variable
    df2 <- df[!grepl(paste(filter, collapse = "|"), df$aaSeqCDR3),]

    write.delim(df2, paste0(x, ".txt"), sep= " ")

    # Return filtered data
    return(df2)
}

# LIST OF FILTERED DATA FRAMES EACH EXPORTED TO .txt FILE
nameproduct <- lapply(names, productiveseq)

推荐阅读