检查 R 中两个数据帧之间的匹配

Check matches between two data frames in R

我有两个几乎相同的数据框,其中包含相同的人(df_A 和 df_B)。我现在想为每个人检查 df_A 和 df_B 中有多少个值匹配(例如,Person 1 在 df_A 和 df_B 中有 3 个相同的值,而第 4 个人有 2 个相同的值)。

我想创建包含匹配值数量信息的新变量。

df_A 和 df_B 可能如下所示:

df_A <- read.table(text=
"ID    Var_1  Var_2    Var_3      Var_4      Var_5      Var_6
1       1       NA       NA       1          NA         1
2       NA      NA       NA       1          1          1
3       NA      1        1        NA         NA         1
4       1       1        NA       NA         1          NA
5       NA      NA        NA       1         1          1", header=TRUE)

df_B <- read.table(text=
"ID   Var_1  Var_2    Var_3        Var_4      Var_5      Var_6
1       1       NA       NA        1          NA          1
2       NA      NA       NA        1          1           1
3       1       NA       1         1          NA          NA
4       1       1        1         NA         NA          NA
5       1       1        1         NA         NA          NA", header=TRUE)

理想情况下,最终结果应该是这样的:

df_C <- read.table(text=
"ID    Matches
1      3    
2      3
3      1
4      2
5      0", header=TRUE)

对于如何使用 R 最有效地实现这一点,您有什么想法吗? 我对 R 比较陌生,想学习如何在没有冗长代码的情况下解决此类问题。感谢您的提示!

这是一个想法。

library(dplyr)
library(tidyr)

left_join(df_A, df_B, by = 'ID') %>%
  pivot_longer(-ID, names_pattern = '(.*).[xy]') %>%
  group_by(ID, name) %>%
  summarise(matches = !any(is.na(value)) & n_distinct(value, na.rm = TRUE)) %>%
  summarise(matches = sum(matches))

#> # A tibble: 5 × 2
#>      ID matches
#>   <int>   <int>
#> 1     1       3
#> 2     2       3
#> 3     3       1
#> 4     4       2
#> 5     5       0