我想在其他多个数据帧中找到数据帧的每一行的频率。换句话说,我必须找出在其他文件中可以看到一行中每两个值的次数
我有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)
}
如果有人能以更快的方式推荐我,我会很感激吗?
答案 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)
可以分两步完成。
对每个文件进行统计。统计102个文件中每行的频率。结果小于原始文件,并提供您需要的信息。
第二步与您的代码类似,但您可以将统计信息保存到内存中,并且可以在首次出现时中断搜索。
它应该快2倍(内存中没有统计数据)。但它取决于数据。 您还可以对统计信息进行排序,并使用quick sort的优势。