0

我正在尝试使用 R 过滤大文件中的重叠行。重叠度设置为 25%。换句话说,任何两行之间的交集元素的数量小于它们并集的0.25倍。如果大于0.25,则删除一行。所以如果我有一个总共有1000 000行的大文件,第一个5行如下:

c6 c24 c32 c54 c67
c6 c24 c32 c51 c68 c78
c6 c32 c54 c67
c6 c32 c55 c63 c85 c94 c75
c6 c32 c53 c67

因为第 1 行和第 2 行相交的元素个数为 3(如 c6,c24,c32),所以它们之间的并集数为 8,(如 c6,c24,c32,c54,c67,c51 ,c68,c78),3/8=0.375 > 0.25,第2行被删除。第3和第5行也是如此。最终答案是第1和第4行。

c6 c24 c32 c54 c67
c6 c32 c55 c63 c85 c94 c75

伪代码如下:

for i=1:(n-1)    # n is the number of rows of a file
    for j=(i+1):n  
        if  overlap degrees of the ith row and jth row is more than 0.25
          delete the jth row from the file
        end
   end

结尾

R代码如下:

   con<-file("inputfile.txt","r")
   fileConn<-file("outputfile025.txt")
   data<-readLines(con,n=1) 
   con1<-strsplit(data,"\t") 
   writeLines(con1[[1]][], fileConn)

   for(i in 2:1000000){
   data<-readLines(con,n=1) 
   con2<-strsplit(data,"\t")

    intersect=length(intersect(con1[[1]][],con2[[1]][]))
    union =length(union(con1[[1]][],con2[[1]][]))

   if ((intersect/union)<0.25){
    writeLines(con2[[1]][], fileConn)
   }

   }
   close(con)
   close(fileConn)

问题是上面的代码只能用于过滤第一行和任何其他行之间的重叠,如何过滤第二、第三、……行和任何其他行之间的重叠。有谁知道如何解决这个问题?谢谢!

4

1 回答 1

0

agrep这是使用广义 Levenshtein 编辑距离在列表的其他元素中使用近似匹配的解决方案(这里是列表的一个元素):

max.distance=list(deletions=0.25)

lapply因此,使用例如循环遍历您的数据:

res <- unlist(lapply(seq_along(ll),function(x){
  res <- agrep(pattern=ll[x],         # for each string
              ll[-x],                # I search between the others strings 
              value=FALSE,max=list(deletions=0.25))  # I set the Levenshtein distance
  if(length(res)==0) NA else res
}))
ll[res[!is.na(res) & duplicated(res)]]

"c6 c24 c32 c54 c67"         
"c6 c32 c54 c67"             
"c6 c32 c55 c63 c85 c94 c75"

然后您可以删除重复值和缺失值:

PS:这里ll是:

ll <- readLines(textConnection(object='c6 c24 c32 c54 c67
c6 c24 c32 c51 c68 c78
c6 c32 c54 c67
c6 c32 c55 c63 c85 c94 c75
c6 c32 c53 c67'))
于 2013-06-21T10:57:50.420 回答