过滤R中的行

时间:2015-01-24 15:51:18

标签: r

我有一个1000行的文件(称为数据),看起来像

ChrNum Base_Position Gene    
1    108 NotGene     
1    114 Gene     
1    160 NotGene 

我在目录中有类似的文件,所以我想编写一个能够浏览文件并给我每个基因的Base_Position的函数

我写了这个函数来做到这一点

position <- apply(data,1,function(a) {
        #go along each row and see if col3 is "Gene"
    genes <- data[data[,3]=='Gene',]
        #give me the position
    genes.up <- genes[,2]
        return(genes.up)
})

但是当我看到结果时

> position                                       
#[1] 114 114 114

所有行都填写了我正在寻找的答案。 我无法理解我做错了什么

2 个答案:

答案 0 :(得分:1)

install.packages("sqldf")
require(sqldf)
position <- sqldf("select * from data where data.Gene = 'Gene' ")

现在你说你有多个文件。有许多方法可以扩展它,从复制和粘贴到使其成为一个功能。听起来好像把它包装成一个适合你需要的功能。

答案 1 :(得分:1)

dplyr适用于这类滤波器并返回数据帧问题的部分

library(data.table)
library(dplyr)
return_positions <- function(filename) { 
    data <- fread(filename)
    output <- data %>% filter(Gene == 'Gene') %>% 
         select(Base_Position)
    return(output)
}

您应该可以通过将所有文件名传递给上述函数来扩展该功能。

list_of_output_tables <- sapply(all_filenames, return_positions)

[编辑]包括如何为许多文件执行此操作。如果它们相当大,我喜欢使用来自data.table的fread来做到这一点。