2015-04-12 27 views
0

要找到差異,我使用了sqldf軟件包。發現R中兩個數據幀之間的差異時,它們僅在行頻率方面有所不同

我有兩個數據幀。它們的區別僅在於第二個數據幀的某些行與第一個數據幀重複多次。也就是說,它們都具有相同的值,僅在頻率方面有所不同。

sqldf似乎沒有顯示它們之間的區別,因爲它看起來像只檢查唯一值。見下文。

我該如何克服這個問題?另外,有沒有其他軟件包可以幫助找出兩幀之間的差異?

col1 = c(1,2,3) 
df1 = data.frame(col1) 

col1 = c(1,2,3,1,2,3,1,2,3) 
df2 = data.frame(col1) 

> df1 
    col1 
1 1 
2 2 
3 3 
> df2 
    col1 
1 1 
2 2 
3 3 
4 1 
5 2 
6 3 
7 1 
8 2 
9 3 

sqldf('SELECT * FROM df1 EXCEPT SELECT * FROM df2') 
[1] col1 
<0 rows> (or 0-length row.names) 
sqldf('SELECT * FROM df2 EXCEPT SELECT * FROM df1') 
[1] col1 
<0 rows> (or 0-length row.names) 

我也嘗試了功能如下,但即使這似乎並沒有幫助

dfdiffmyfunc <- function(x.1,x.2,...){ 
    x.1p <- do.call("paste", x.1) 
    x.2p <- do.call("paste", x.2) 
    x.1[! x.1p %in% x.2p, ] 
} 

> dfdiffmyfunc(df1,df2) 
numeric(0) 
> dfdiffmyfunc(df2,df1) 
numeric(0) 

回答

0

你可以嘗試

f1 <- function(dat1, dat2){ 
     indx1 <- do.call(paste, 
       transform(dat1, new=ave(col1, col1, FUN=seq_along))) 
     indx2 <- do.call(paste, 
       transform(dat2, new=ave(col1, col1, FUN=seq_along))) 
     dat2[!indx2 %in% indx1,, drop=FALSE] } 
f1(df1, df2) 
# col1 
#4 1 
#5 2 
#6 3 
#7 1 
#8 2 
#9 3 
0

取決於你想要什麼這可能做到這一點:

sqldf("select rowid, * from df2 except select rowid, * from df1") 

givi ng:

rowid col1 
1  4 1 
2  5 2 
3  6 3 
4  7 1 
5  8 2 
6  9 3 
相關問題