比较两个相似的数据框并在它们之间找到不同的值

时间:2017-01-18 19:44:24

标签: r dataframe

这是一个看似基本的问题,如果这是一个重复的问题,我会提前道歉。我环顾四周,没有看到任何东西。

我有两个充满字符串的数据帧。我想看看它们是否完全相互重复。

如果不是,我想确定哪些值不同。

具体来说,鉴于此数据框:

| x | y |
|---|---|
| a | e |
| b | f |
| c | g |
| d | h |

和这个数据框:

| x | y |
|---|---|
| a | l |
| b | m |
| j | g |
| k | h |

我想生成这个结果(一个充满非匹配值的df):

| x | y |
|---|---|
|   | l |
|   | m |
| j |   |
| k |   |

This question与我的想法非常接近,但它希望找到相同的完整,而不是值。

1)我认为除了通过字符串匹配逐个迭代每个值之外我别无选择。我知道这个df1 %in% df2将测试行。但是我如何测试每个元素?

2)在我可以测试每个元素之后,我需要构建一个数据帧来存储不匹配。我不知道怎么做。

这似乎是一个简单的想法,但是打破它,实现实际上似乎相当复杂。任何正确方向的颠簸都会受到高度赞赏。

我的数据:

df1 <- data.frame(
  x = c('a', 'b', 'c', 'd'),
  y = c('e', 'f', 'g', 'h')
)


df2 <- data.frame(
  x = c('a', 'b', 'j', 'k'),
  y = c('l', 'm', 'g', 'h')
)

1 个答案:

答案 0 :(得分:3)

你可以这样做:

df2[mapply(function(x,y)   x%in%y ,df1,df2)]<-NA
     x    y
1 <NA>    l
2 <NA>    m
3    j <NA>
4    k <NA>

这会直接影响df2,最好有副本。

说明:
mapply()用于在%in%df1的第一列之间应用df2,然后在第二列之间应用> mapply(function(x,y) x%in%y,df1,df2) x y [1,] TRUE FALSE [2,] TRUE FALSE [3,] FALSE TRUE [4,] FALSE TRUE ,如果还有更多则等等。
这给出了:

TRUE

NA's是匹配的值,我们希望将其更改为Select * from tb.Users u where u.Approved = 1 and u.userID IN ( SELECT us.UserID us FROM tb.UserStatementes us WHERE us.LogDate between date1 and date2 )