比较数据框 - 不匹配案例的百分比
comparing dataframe - percentage of mismatched cases
我有两个人为心理测试编写相同的变量(超过 400 个变量),我需要比较数据集。我需要两个结果:
- 我只需要查看不匹配的特定案例
- 作为最终结果,我需要每个变量的不匹配百分比。
这里的 "percentage of mismatch per variable" 是什么意思:
A <- tibble( ID = c(1:10),
v1 = rep(1),
v2 = rep(2),
v3 = rep(3))
B <- tibble( ID = c(1:10),
v1 = c(1,1,1,1,10,1,1,1,1,1),
v2 = c(30,2,2,2,51,2,2,2,2,40),
v3 = c(3,3,3,3,3,3,3,65,3,90))
A;B
# A tibble: 10 x 4
ID v1 v2 v3
<int> <dbl> <dbl> <dbl>
1 1 1 2 3
2 2 1 2 3
3 3 1 2 3
4 4 1 2 3
5 5 1 2 3
6 6 1 2 3
7 7 1 2 3
8 8 1 2 3
9 9 1 2 3
10 10 1 2 3
# A tibble: 10 x 4
ID v1 v2 v3
<int> <dbl> <dbl> <dbl>
1 1 1 30 3
2 2 1 2 3
3 3 1 2 3
4 4 1 2 3
5 5 10 51 3
6 6 1 2 3
7 7 1 2 3
8 8 1 2 65
9 9 1 2 3
10 10 1 40 90
如何将数据集 A 与数据集 B 进行比较以获得如下结果:
result<- tibble(variables = c("v1", "v2", "v3"),
n.mismatch = c(1,3,2),
percentage.mismatch = c(0.10, 0.30, 0.20))
result
# A tibble: 3 x 3
variables n.mismatch percentage.mismatch
<chr> <dbl> <dbl>
1 v1 1 0.1
2 v2 3 0.3
3 v3 2 0.2
我们可以使用Map
来比较列值。
as.data.frame(Map(function(x, y) {
inds <- x != y
c(n.mismatch = sum(inds), percentage.mismatch = mean(inds))
}, A[-1], B[-1]))
# v1 v2 v3
#n.mismatch 1.0 3.0 2.0
#percentage.mismatch 0.1 0.3 0.2
同样,在tidyverse
中,我们可以使用map2
purrr::map2_df(A[-1], B[-1], ~{
inds = .x != .y
tibble::tibble(n.mismatch = sum(inds), percentage.mismatch = mean(inds))
}, .id = "variables")
# variables n.mismatch percentage.mismatch
# <chr> <int> <dbl>
#1 v1 1 0.1
#2 v2 3 0.3
#3 v3 2 0.2
我有两个人为心理测试编写相同的变量(超过 400 个变量),我需要比较数据集。我需要两个结果:
- 我只需要查看不匹配的特定案例
- 作为最终结果,我需要每个变量的不匹配百分比。
这里的 "percentage of mismatch per variable" 是什么意思:
A <- tibble( ID = c(1:10),
v1 = rep(1),
v2 = rep(2),
v3 = rep(3))
B <- tibble( ID = c(1:10),
v1 = c(1,1,1,1,10,1,1,1,1,1),
v2 = c(30,2,2,2,51,2,2,2,2,40),
v3 = c(3,3,3,3,3,3,3,65,3,90))
A;B
# A tibble: 10 x 4
ID v1 v2 v3
<int> <dbl> <dbl> <dbl>
1 1 1 2 3
2 2 1 2 3
3 3 1 2 3
4 4 1 2 3
5 5 1 2 3
6 6 1 2 3
7 7 1 2 3
8 8 1 2 3
9 9 1 2 3
10 10 1 2 3
# A tibble: 10 x 4
ID v1 v2 v3
<int> <dbl> <dbl> <dbl>
1 1 1 30 3
2 2 1 2 3
3 3 1 2 3
4 4 1 2 3
5 5 10 51 3
6 6 1 2 3
7 7 1 2 3
8 8 1 2 65
9 9 1 2 3
10 10 1 40 90
如何将数据集 A 与数据集 B 进行比较以获得如下结果:
result<- tibble(variables = c("v1", "v2", "v3"),
n.mismatch = c(1,3,2),
percentage.mismatch = c(0.10, 0.30, 0.20))
result
# A tibble: 3 x 3
variables n.mismatch percentage.mismatch
<chr> <dbl> <dbl>
1 v1 1 0.1
2 v2 3 0.3
3 v3 2 0.2
我们可以使用Map
来比较列值。
as.data.frame(Map(function(x, y) {
inds <- x != y
c(n.mismatch = sum(inds), percentage.mismatch = mean(inds))
}, A[-1], B[-1]))
# v1 v2 v3
#n.mismatch 1.0 3.0 2.0
#percentage.mismatch 0.1 0.3 0.2
同样,在tidyverse
中,我们可以使用map2
purrr::map2_df(A[-1], B[-1], ~{
inds = .x != .y
tibble::tibble(n.mismatch = sum(inds), percentage.mismatch = mean(inds))
}, .id = "variables")
# variables n.mismatch percentage.mismatch
# <chr> <int> <dbl>
#1 v1 1 0.1
#2 v2 3 0.3
#3 v3 2 0.2