2015-12-13 3 views
0

Я хотел бы иметь возможность сравнить две таблицы и вернуть R список записей и переменных, которые не совпадают.Сравните две таблицы и возвращаемый список несоответствий

Например, с помощью следующих двух таблиц

> df1 
    id let num 
1 1a a 1 
2 2b b 2 
3 3c c 3 
4 4d d 4 
5 5e e 5 
> df2 
    id let num 
1 1a a 1 
2 2b b 2 
3 3c c 3 
4 4d e 4 
5 5e d 5 

Я хотел бы, чтобы функция сравнения() возвращает что-то вроде «ид = 4d, пусть», дайте мне знать, что переменная пусть в записи с id = 4d не соответствует.

Я видел библиотеку сравнения в CRAN, но только возвращает TRUE или FALSE для всей переменной, если есть несоответствие. Есть ли библиотека с другой функцией сравнения или способ сделать это вручную?

ответ

2
df1 <- read.table(text=" 
id let1 num1 
1a a 1 
2b b 2 
3c c 3 
4d d 4 
5e e 5", head=T, as.is=T) 

df2 <- read.table(text=" 
id let2 num2 
1a a 1 
2b b 2 
3c c 3 
4d e 4 
5e d 5", head=T, as.is=T) 

df <- merge(df1, df2, by="id") 
df$let <- ifelse(df$let1 == df$let2, "equal", "not equal") 
df$num <- ifelse(df$num1 == df$num2, "equal", "not equal") 
df 
# id let1 num1 let2 num2  let num 
# 1 1a a 1 a 1  equal equal 
# 2 2b b 2 b 2  equal equal 
# 3 3c c 3 c 3  equal equal 
# 4 4d d 4 e 4 not equal equal 
# 5 5e e 5 d 5 not equal equal 
+0

Вы также можете использовать только 'df $ let <- df $ let1 == df $ let2' вместо' ifelse (df $ let1 == df $ let2, "equal", "not equal") ' – Jaap

+0

I знайте это. Я написал точно так же, как вы изначально. Наконец, я изменил свой код, чтобы сделать его более явным. –

+0

Это довольно круто. Мне также нравится явный стиль кодирования, я фактически изменил его на 'df $ let <- ifelse (df $ let1 == df $ let2," equal ", paste (df $ let1, df $ let2, sep =" =/= ")' так что теперь, когда данные не совпадают, я могу быстро его проверить, чтобы увидеть, что это нечто вроде 'international =/= intl' или что-то в этом роде. Спасибо за помощь! – jamzsabb

0

Вы имеете в виду что-то вроде which? Быстрый воспроизводимый пример:

> m1 <- m2 <- matrix(1:9, 3) 
> diag(m1) <- 0 
> which(m1 != m2, arr.ind = TRUE) 
    row col 
[1,] 1 1 
[2,] 2 2 
[3,] 3 3 
0

Что-то вроде:

df_diff <- list() 

for (i in 1:ncol(df1)) 
{ 
df_diff[[i]] <- df1$id[df2[i] != df1[i]] 
names(df_diff)[i] <- names(df1)[i] 
} 

Это должно произвести (надеюсь :)) список векторов символов (один для каждой переменной). Каждый вектор содержит идентификаторы df1, где записи двух df не совпадают.

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