我有这个数据框:
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/