关于ff数据框架的另一个问题,但希望这应该是我关于它们的最后一个问题。有一个尴尬的问题,但首先是代码:
fda<-data.frame(c(1,2),c(3,4))
colnames(fda)<-c("col1","col2")
fdb<-data.frame(c(3,7),c(1,5))
colnames(fdb)<-c("col1","col2")
fd<-rbind(fda,fdb)
fd<-data.frame(fd)
library(ff)
library(ffbase)
fd<-as.ffdf(fd)
a<-c(10,12,13,11)
b<-c(13,15,10,14)
fd$col3<-as.ff(a)
fd$col4<-as.ff(b)
fd
表格如下:
col1 col2 col3 col4
1 3 10 13
2 4 12 15
3 1 13 10
7 5 11 14
以下代码会删除所有重复的行。
rm(fda)
rm(fdb)
fd$dup<-duplicated.ffdf(fd)
fdfin<-subset.ffdf(fd, fd$dup == "FALSE")
fdfin<-as.ffdf(fdfin[,-5])
fdfin
如果您看到第1行和第3行是重复的,但顺序略有不同。我需要对代码进行排序,以便行匹配然后应用上面的重复代码或一些替代代码来删除第1行或第3行。
这是一个~12,000,000行表的小样本,所以我需要使用ff或ffbase包。
以下是关于普通数据框架的工作,所以我想知道如何使用ff函数来做同样的事情:
df<-temp1[,1:2] #temp1 is a data frame
df.sort<-t(apply(df,1,sort))
sortdup<-temp1[!duplicated(df.sort),]
如果还有其他信息需要,请告诉我
干杯,
洛坎
答案 0 :(得分:1)
在ff包中查看?ffrowapply以对行进行排序(apply(df,1,sort))
sortdup&lt; -temp1 [!duplicated(df.sort),]在ffbase软件包的0.6版本中可以正常工作,因为它允许根据逻辑的ff向量进行索引。
要安装0.6版的ffbase,请运行以下代码。
download.file(url="http://fffunctions.googlecode.com/git-history/b6fa5617810e012e5d809d77a9a99dbb25c7e6dc/output/ffbase_0.6.tar.gz", destfile="ffbase_0.6.tar.gz")
install.packages("ffbase_0.6.tar.gz", repos=NULL)
如果?ffapply不起作用,您可以随时将此类功能用于问题的应用部分:
ffdfapply <- function(X, MARGIN, FUN, ...){
## Currently only handles return types ffdf and ff_vector
stopifnot(is.ffdf(X))
xchunks <- chunk(X)
result <- NULL
if(MARGIN==1){
for (i in xchunks){
res.chunk <- apply(X[i, ], MARGIN=1, FUN=FUN, ...)
if(is.data.frame(res.chunk)){
result <- ffdfappend(result, res.chunk)
}else{
result <- ffappend(result, res.chunk)
}
}
}else{
stop("only MARGIN=1 currently allowed")
}
result
}