在r中的多个数据帧中查找一组值的频率

时间:2014-06-12 07:37:47

标签: r for-loop count frequency

我想在其他多个数据帧中找到数据帧的每一行的频率。换句话说,我必须找出在其他文件中可以看到一行中每两个值的次数

我有103个文件。如果将它们作为数据框读取,它们将如下:

    V1   V2
    1    xbc
    1    xbd
    1    xbf
    2    xbr
    2    xbt
    3    xbu
    3    xbi
    3    xbo

(V2不是数字)。我必须找出在其他102个文件中可以看到文件中每行的次数!

我尝试嵌套for循环。但它太慢了!因为每个文件至少有4500行!

    for(j in 1:nrow(df1)){
       df1<- df1[j,]   #select just one row of the data frame each time to find its frequency!

       setwd("my path")
       file<-list.files(pattern="^inp")

       for (i in file) {
       df<-read.table(i)
       mylist<-list()
       tmp <- merge(df1,df, c("V1", "V3"))
       mylist[[i]] <- tmp #put all vectors in the list
      }
     df <- do.call("rbind",mylist) #combine all vectors into a matrix

     k<-toString(j) #to avoid connection error in write.table
     setwd("my path")
     write.table(x, file=k, append=FALSE, sep="\t", row.names=FALSE, col.names=FALSE) 

}

如果有人能以更快的方式推荐我,我会很感激吗?

2 个答案:

答案 0 :(得分:0)

这是一个小例子。 dat2仅为dat1,其中三个值已更改,表明我们发现它们与dat1中的值不同。

> dat1 <- read.table(h=T, text = "V1   V2
  1    xbc
  1    xbd
  1    xbf
  2    xbr
  2    xbt
  3    xbu
  3    xbi
  3    xbo")
> dat2 <- dat1
> dat2[c(2, 4, 5),1] <- 0

您可以使用%in%all来迭代第二个数据框,以确定整行是否匹配。这将返回一个逻辑向量,我们将其相加以获得dat2中同样位于dat1的行数。

> sap <- sapply(seq(nrow(dat1)), function(i){
      all(dat2[i, ] %in% dat1[i, ])
  }))
> sum(sap)
# [1] 5

如评论中所述,我们可以rbind将所有数据放在一起,然后只需使用duplicated即可获得结果。

> d <- do.call(rbind, list(dat1, dat2))
> sum(duplicated(d))
[1] 5

答案 1 :(得分:-1)

可以分两步完成。

  1. 对每个文件进行统计。统计102个文件中每行的频率。结果小于原始文件,并提供您需要的信息。

  2. 第二步与您的代码类似,但您可以将统计信息保存到内存中,并且可以在首次出现时中断搜索。

  3. 它应该快2倍(内存中没有统计数据)。但它取决于数据。 您还可以对统计信息进行排序,并使用quick sort的优势。