2015-12-13 127 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 

我想一个比较()函数返回类似“ID = 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] 
} 

这应该产生(希望:))字符向量的列表(每个变量)。每个矢量都包含两个df的记录不匹配的df1的ID。

相关问题