检查 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
我有两个几乎相同的数据框,其中包含相同的人(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