首页 > 解决方案 > 如何在 R 中最接近的 3 个值中进行选择?

问题描述

我想为每一个选择ID两个最接近的值Cq。我以为我已经弄清楚了,但这取决于行位置...

这是我的数据集形式的示例:

df <- data.frame(ID = c("A","A","A","B","B","B","C","C","C"), 
                 Cq = c(34.32,34.40,34.31,31.49,31.40,31.49,31.22,31.31,31.08))
  ID    Cq
1  A 34.32
2  A 34.40
3  A 34.31
4  B 31.49
5  B 31.40
6  B 31.49
7  C 31.22
8  C 31.31
9  C 31.08

我试过的

df4 <-df %>% 
  group_by(ID) %>% 
  arrange(Cq) %>% 
  mutate(diffvals= Cq - lag(Cq)) %>%
  filter(row_number() == 1 | row_number() == 2)

#Output
ID       Cq   diffvals
1 A      34.31   NA     
2 A      34.32   0.0100
3 B      31.40   NA     
4 B      31.49   0.0900
5 C      31.08   NA     
6 C      31.22   0.14 

和预期的输出

 ID    Cq
1  A 34.32
2  A 34.31
3  B 31.49
4  B 31.49
5  C 31.22
6  C 31.31

我之前尝试过对我的数据集进行排序,但它并没有改变任何东西。我也尝试过使用filter(diffvals=wich.min==diffvals),但我不知道如何提取最小的两个。

如果您有任何想法,它将对我有很大帮助!

提前致谢

标签: rdplyr

解决方案


这是一个基本的 R 代码,其中dist用于枚举组内所有对的距离,即

dfout <- do.call(rbind,
                 lapply(split(df,df$ID), 
                        function(v) {
                          d <- `diag<-`(as.matrix(dist(v$Cq)),NA)
                          d[lower.tri(d)] <- NA
                          v[which(d==min(d,na.rm = T),arr.ind = T),]
                        }
                 ))

这样

> dfout
    ID    Cq
A.1  A 34.32
A.3  A 34.31
B.4  B 31.49
B.6  B 31.49
C.7  C 31.22
C.8  C 31.31

推荐阅读