[英]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.