繁体   English   中英

当它们仅在行频率方面有所不同时,发现R中的两个数据帧之间存在差异

[英]finding difference between two data frames in R when they only differ in terms of frequency of rows

为了找到区别,我使用了sqldf包。

我有两个数据框。 它们的唯一不同之处在于,第二个数据帧与第一个数据帧相比,有些行重复了多次。 也就是说,它们都具有相同的值,只是频率不同。

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)

你可以试试

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

具体取决于您想要什么,可以这样做:

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

赠送:

  rowid col1
1     4    1
2     5    2
3     6    3
4     7    1
5     8    2
6     9    3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM