这是一个看似基本的问题,如果这是一个重复的问题,我提前道歉。我环顾四周,什么也没看到。
我有两个充满字符串的数据框。我想看看它们是否完全相同。
如果不是,我想确定哪些值不同。
具体来说,给定这个数据框:
| 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')
)
最佳答案
你可以这样做:
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()
用于在 df1
和 df2
的第一列之间应用 %in%
,并且然后是第二个,依此类推。
这给出:
> 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 的
。
关于r - 比较两个相似的数据帧并找到它们之间的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41728123/