R语言 基于列中的匹配值比较2个数据集

lskq00tm  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(94)

我试图将一个数据集中的数据与另一个数据集进行比较,每当我在第一个数据集中看到代码时,我希望检查第二个数据集,如果该代码出现在那里,则检查其他列的值是否匹配。

df1
code      count     length     width
13525      64        5          10
13456      20        10         20
13455      22        10         25
12334      10        2          5
12333      12        5          5
13234      18        8          10

现在我想检查第二个数据集,检查每个代码的计数,长度和宽度列是否正确。例如,我知道代码12333不在第二个数据集中,这不是一个问题,我担心的是其他任何列都不同。

df2
code      count     length     width
13525      64        5          10
13456      20        10         22
13455      22        11         25
12334      10        2          5
13234      18        8          10

我想得到的是不同价值观的第三个同义词。我不完全确定最好的方法去做这件事,我努力匹配的代码主要。比如说;

codes_that_dont_match
13456      20        10         22
13455      22        11         25
wsxa1bj1

wsxa1bj11#

你可以尝试

> setdiff(df2, df1)
   code count length width
1 13456    20     10    22
2 13455    22     11    25

x1 <- do.call(paste, df1)
x2 <- do.call(paste, df2)
df2[is.na(match(x2, x1)), ]

这给

code count length width
2 13456    20     10    22
3 13455    22     11    25
3vpjnl9f

3vpjnl9f2#

正如其他人所提到的,可以用anti_join来检测差异。

library(dplyr)
df1 = 
  read.table(text = 
        "      code      count     length     width
             13525      64        5          10
             13456      20        10         20
             13455      22        10         25
             12334      10        2          5
             12333      12        5          5
             13234      18        8          10",
        header = T)

df2 =
  read.table(
    text =
      "code      count     length     width
        13525      64        5          10
        13456      20        10         22
        13455      22        11         25
        12334      10        2          5
        13234      18        8          10",
    header = T
    )

如何使用该函数取决于您想要找到的差异。
df1中没有匹配项的行

df1 |> 
  anti_join(df2,by = names(df1))

#    code count length width
# 1 13456    20     10    20
# 2 13455    22     10    25
# 3 12333    12      5     5

或者df2中的行在df1中没有匹配项

df2 |> 
  anti_join(df1,by = names(df1))

#    code count length width
# 1 13456    20     10    22
# 2 13455    22     11    25

相关问题