我有兩個數據框架,預計是相同的(按PK排序)。
我需要列出不同的行 - 具有任何不同列的任何行。
顯示的最後一個功能完成了這項工作,但耗時太長。
@Gilles提供了一個更好的解決方案,使用apply。這是顯示交替行的修改版本(df1
,df2
)。列出數據幀不同的行 - 性能不佳
良好的性能解決方案(0.1秒!):
compDfOrden=function(df1,df2){
df1=df1[complete.cases(df1),]
df2=df2[complete.cases(df2),]
df1d=data.frame(); df2d=data.frame()
if(nrow(df1)!=nrow(df2)){cat('different lines number'); return()
} else linhas=nrow(df1)
if(ncol(df1)!=ncol(df2)){cat('different columns number'); return()
} else colunas=ncol(df1)
different <- apply(df1 != df2, 1, any)
difRows=sum(different)
if(difRows>0){
df1d=cbind(df='df1',l=1:difRows,df1[different,])
df2d=cbind(df='df2',l=1:difRows,df2[different,])
dfd=rbind(df1d,df2d)
dfd=with(dfd,dfd[order(l,df),])[,-2]
} else dfd=data.frame()
return(dfd)
}
}
tz1=Sys.time()
z=compDfOrden(t1,t2)
Sys.time()-tz1
Time difference of 0.1000059 secs
nrow(z)/2
9303
nrow(t1)
9305
row.names(z)=NULL
head(z,2)
df c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17
1 df1 1390 ALPA4 F 8 1 0.224000 0.206000 0.275000 0.277000 16.09403 -18.9546 20.75508 2.7116 -1.926 0.4254945 10.3 11.08
2 df2 1390 ALPA4 F 8 1 0.223516 0.205639 0.274514 0.277207 16.10096 -18.9821 20.75508 2.6829 -1.926 0.4254945 10.3 11.08
c18 c19 c20 c21
1 10.61 2.02 6.931000 2.920000
2 10.61 2.02 6.930612 2.921772
較差的性能解決方案(2.6分):
compDfOrden=function(df1,df2){
df1d=data.frame()
if(nrow(df1)!=nrow(df2)){cat('no. linhas diferentes'); return()
} else linhas=nrow(df1)
if(ncol(df1)!=ncol(df2)){cat('no. colunas diferentes'); return()
} else colunas=ncol(df1)
for(x in 1:linhas){
for(y in 1:colunas){
if(df1[x,y]!=df2[x,y]){
#if(!identical(df1[x,],df2[x,])){
df1d=rbind(df1d,cbind(df='df1',df1[x,]))
df1d=rbind(df1d,cbind(df='df2',df2[x,]))
break()}
}
}
return(df1d)
}
t1=Sys.time()
z=compDfOrden(df1,df2)
Sys.time()-t1
Time difference of 2.584698 mins
nrow(df2)
9305
if(!identical(df1[x,],df2[x,])){...
更糟糕的是(2.64分鐘)。
爲什麼這個問題negativated? – xm1
我沒有downvote,但不清楚你到底在問什麼。特別是在你編輯之後加入Gilles的答案。而你的問題的標題是非常通用的。 – Uwe
@UweBlock我在詢問性能增益。我會改變標題。吉爾斯的回答是完美的,我改變了功能來融入他的想法。我這樣做,因爲它可以用於搜索相同的其他人。 – xm1