r - 过滤最接近目标值的数字并消除重复的观测值

标签 r dataframe dplyr filter subset

我有这个数据框:

data_a <- read.csv(text = "
date,treatment,stage
1,a,1
2,a,10
3,a,20
4,a,30
5,a,60
6,a,70
7,a,89
8,a,91
9,a,92
1,b,1
2,b,10
3,b,20
4,b,30
5,b,59.8
6,b,60.2
7,b,88.8
8,b,90.2
9,b,92
1,c,1
2,c,10
3,c,20
4,c,60
5,c,66
6,c,70
7,c,80
8,c,85
9,c,85")

我需要在每个治疗中过滤匹配阶段 10、60和89的观察结果(或最接近这些目标值的观察结果)。我的代码是这样的:

filtered_data <- data_a %>%
  group_by(treatment) %>%
  filter(abs(stage - 10) == min(abs(stage - 10)) |
         abs(stage - 60) == min(abs(stage - 60)) |
         abs(stage - 89) == min(abs(stage - 89)))

此代码部分实现了目的,但对于处理 b 和 c 存在问题。

在 b 中,两个观测值与目标具有相同的差异。因此,这两个观察结果都被过滤掉,这是不希望的。

在c中,两个观测值具有相同的值并且最接近目标,因此两个观测值都被选择,这是不期望的。

所需的输出是这样的:

filtered_data <- read.csv(text = "
date,treatment,stage
2,a,10
5,a,60
7,a,89
2,b,10
5,b,59.8
7,b,88.8
2,c,10
4,c,60
8,c,85")

最佳答案

我会这样做

library(tidyverse)

crossing(
  data_a,
  target_stage = c(10, 60, 89)
  ) %>% 
  group_by(treatment, target_stage) %>% 
  slice_min(
    abs(stage-target_stage),
    with_ties = F
    )
#> # A tibble: 9 × 4
#> # Groups:   treatment, target_stage [9]
#>    date treatment stage target_stage
#>   <int> <chr>     <dbl>        <dbl>
#> 1     2 a          10             10
#> 2     5 a          60             60
#> 3     7 a          89             89
#> 4     2 b          10             10
#> 5     5 b          59.8           60
#> 6     7 b          88.8           89
#> 7     2 c          10             10
#> 8     4 c          60             60
#> 9     8 c          85             89

创建于 2023 年 5 月 22 日 reprex v2.0.2

如果使用交叉扩展网格,则可以按此分组并找到最小的,同时删除连接

关于r - 过滤最接近目标值的数字并消除重复的观测值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76307361/

相关文章:

r - 只有组中差异小于 'n' 的行

r - 自定义分组 dplyr 函数 (sample_n)

r - 基于最小 5 个连续值的向量序列的子集数据帧

r - pmap 在不同长度的列表上

r - 按组计算非 NA 值

r - 计算 R 中 tidygraph 对象列表中相同列的频率?

根据列名称替换列值

r - 如何在 Shiny 的数据表中扩展包装文本

r - 如何在R中使用sparklyr读取S3文件夹/存储桶中的所有文件?

pandas - 转置和重新排列 Dataframe pandas