我有一个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
所有行都填写了我正在寻找的答案。 我无法理解我做错了什么
答案 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来做到这一点。