0

我有 2 个“完全相同”的数据框。它们之间的区别在于,一个有 676 个观察值(行),另一个有 666 个观察值。我不知道在第二个数据框中遗漏了哪些行。

如果有人可以向我展示如何使用遗漏的 10 行制作第三个数据框的代码,这对我来说是最简单的。

数据框的名称:- dataset1 (676) - dataset2 (666)

谢谢。

4

3 回答 3

3
dataset1[tail(!duplicated(rbind(dataset2, dataset1)), nrow(dataset1)), ]
于 2013-10-14T13:01:12.213 回答
1

这是一种方法:

library(qdap)

## generate random problem
prob <- sample(1:nrow(mtcars), 1)    
## remove the random problem row
mtcars2 <- mtcars[-prob, ]   
## Throw it into a list of 2 dataframes so they're easier to work with
dat <- list(mtcars, mtcars2)   
## Use qdap's `paste2` function to paste all columns together
dat2 <- lapply(dat, paste2)   
## Find the shorter data set
wmn <- which.min(sapply(dat2, length))
## Add additional element to shorter one
dat2[[wmn]] <- c(dat2[[wmn]], NA)
## check each element of the 2 pasted data sets for equality
out <- mapply(identical, dat2[[1]], dat2[[2]])

## Which row's the problem
which(!out)[1]
which(!out)[1] == prob

如果which(!out)[1]等于NA问题在最后一行。

当你开始看到FALSE这就是问题所在。

编辑:删除for循环

于 2013-10-14T12:55:18.190 回答
0

我会说尝试使用merge然后查找合并结果的NA值。

这是一个使用虚拟数据的示例:

set.seed(1)
df1 <- data.frame(x=rnorm(100),y=rnorm(100))
df2 <- df1[-sample(1:100,10),]
dim(df1)
# [1] 100   2
dim(df2)
# [1] 90  2
out <- merge(df1,df2,by='x',all.x=TRUE)
in1not2 <- which(is.na(out$y.y))
in1not2
# [1]  6 25 33 51 52 53 57 73 77 82

然后你可以提取:

> df1[in1not2,]
           x           y
6  -0.8204684  1.76728727
25  0.6198257 -0.10019074
33  0.3876716  0.53149619
51  0.3981059  0.45018710
52 -0.6120264 -0.01855983
53  0.3411197 -0.31806837
57 -0.3672215  1.00002880
73  0.6107264  0.45699881
77 -0.4432919  0.78763961
82 -0.1351786  0.98389557
于 2013-10-14T12:50:12.663 回答