【问题标题】:comparing dataframe - percentage of mismatched cases比较数据框 - 不匹配案例的百分比
【发布时间】:2020-06-18 17:23:17
【问题描述】:

我有两个人为心理测试编写相同的变量(超过 400 个变量),我需要比较数据集。我需要两个结果:

  1. 我只需要查看不匹配的特定情况,并且
  2. 作为最终结果,我需要每个变量的不匹配百分比。

我所说的“每个变量的不匹配百分比”是什么意思:

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

【问题讨论】:

  • 你会比较每一行吗??
  • transform(data.frame(n=colSums(A!=B)[-1]),perc = n/nrow(A))

标签: r dataframe comparison percentage tibble


【解决方案1】:

我们可以使用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

【讨论】:

    猜你喜欢
    • 2019-10-30
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多