首页 > 解决方案 > 查找每行中特定列的最小差异,而不是 R 中的整个数据帧(或查找最接近的值)

问题描述

我有一个看起来像这样的df:

        expected_1      expected_2      actual_1       actual_2       actual_3
1               NA       1.0000000      0.2197744      0.9981707             NA
2               NA       1.0000000      0.3267090      0.9925908             NA
3               NA       1.0000000      0.2754576      0.9951685             NA
4               NA       1.0000000      0.1034605      0.4849989      0.9927820
5               NA       1.0000000      0.4100000      0.9952586             NA
6               NA       1.0000000      0.3727756      0.9708294             NA
7               NA       1.0000000      0.2672000      0.6850000      0.9800000
8               NA       1.0000000      0.2503922      0.9916763             NA
9               NA       0.5000000      0.4609574             NA             NA
10       0.3333333       0.6666667      0.3012779      0.6437114             NA
11       0.2500000       0.7500000      0.2980286      0.6383628      1.0000000
12       0.2000000       0.8000000      0.1831247      0.5060070      0.7086295
13       0.1428571       0.8571429      0.2914983      0.6599879             NA
14              NA       1.0000000      0.2934735      0.9923371             NA

对于expected_1 和expected_2,我想找到最接近它的实际值。为了首先找到每一行的最小差异,我尝试这样做:

df <- df %>% mutate(
  min_dist_1 =  min(abs(actual_1 - expected_1), abs(actual_2 - expected_1), abs(actual_3 - expected_1), na.rm = T),
  min_dist_2 =  min(abs(actual_1 - expected_2), abs(actual_2 - expected_2), abs(actual_3 - expected_2), na.rm = T),
)

但是,它只给出了整个 df 的最小值,而不是每一行的最小值。

          expected_1  expected_2     actual_1       actual_2           actual_3   min_dist_1              min_dist_2
1               NA       1.0000000      0.2197744      0.9981707             NA         0.003124393        3.414614e-05
2               NA       1.0000000      0.3267090      0.9925908             NA         0.003124393        3.414614e-05
3               NA       1.0000000      0.2754576      0.9951685             NA         0.003124393        3.414614e-05
4               NA       1.0000000      0.1034605      0.4849989      0.9927820         0.003124393        3.414614e-05
5               NA       1.0000000      0.4100000      0.9952586             NA         0.003124393        3.414614e-05
6               NA       1.0000000      0.3727756      0.9708294             NA         0.003124393        3.414614e-05

如何找到每行的最小差异?

标签: rdataframedplyr

解决方案


您的方法的主要问题是您使用的min()是未矢量化的函数。您应该使用pmin()pmap(min)

这将做你想要的,并且更简洁:首先使用mutate across所需的“实际”列来获取“差异”列。然后将这些列通过管道连接到pmap(min)

library(dplyr)

df %>% mutate('min_dist_1'=across(contains('actual'), ~abs(.x - expected_1)) %>% pmap(min, na.rm = TRUE),
              'min_dist_2'=across(contains('actual'), ~abs(.x - expected_2)) %>% pmap(min, na.rm = TRUE))

推荐阅读