2013-10-14 3 views
2

У меня есть 2 dataframes, которые «точно» одинаковы. Разница между ними заключается в том, что у одного есть 676 наблюдений (рядов), а во втором - 666 наблюдений. Я не знаю, какая из этих строк пропущена во втором фрейме.Как найти разницу между 2 кадрами данных?

Было бы самым легким для меня, если кто-то может показать мне код, как сделать третий фреймворк с теми 10 строками, которые пропущены.

Имя dataframes: - DataSet1 (676) - dataset2 (666)

Thx.

+0

у вас есть уникальные идентификаторы строк в обеих таблицах? –

+0

Нет, это было бы легко, если бы у меня было какое-то определенное количество каждой строки или что-то в этом роде. Проблема заключается в том, что один фрейм данных преобразуется из другого, и я не знаю, почему в то время как это преобразование я теряю эти 10 строк ... –

+2

В этом случае вы можете захотеть опубликовать кусок кода, который также создает dataset2. –

ответ

3
dataset1[tail(!duplicated(rbind(dataset2, dataset1)), nrow(dataset1)), ] 
+0

+1 Хороший однострочный. – Thomas

+0

Thx много. Это то, что я искал! –

+0

I + 1'ed (его умное решение), затем сдерживается: я думаю, вы должны это объяснить. Как обычно, холодные бобы! –

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 
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, в этом случае проблема не решена.

EDIT: убран for петли

+0

Я сделал Томас для других. Я обычно не решаюсь добавить дополнительные комментарии, когда плакат так мало задает вопрос. Я, как правило, не ответил бы на такой плохо отформатированный (ленивый) вопрос, но сама проблема была интересной и интересной. Трудно сравнивать ответы на данный момент b/c, каждый из которых создал собственный набор данных, а не плакат, создающий MWE. –

Смежные вопросы