r - 如何在 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)
,但我不知道如何提取最小的两个。
如果您有任何想法,它将对我有很大帮助!
提前致谢
解决方案
这是一个基本的 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
推荐阅读
- javascript - 我如何在 Python 3 上执行此 javascript 代码?
- python - 在我的有效前沿没有得到子弹形状
- mysql - Wordpress 和 mysql pod 推出正确,但 wordpress 未显示在我的浏览器上
- javascript - 如何使用 JQuery Dropzone 将额外参数传递给我的 java 控制器方法
- bash - 难倒:这个脚本没有按预期工作?
- python - 为什么我的矩形不起作用并使玩家与门交互,因为它应该在 pygame
- javascript - 如何更改范围输入滑块拇指值的边框半径?
- php - wordpress(elementor)如何将内容从一个页面插入另一个页面
- javascript - 行情留言 | 不和谐.js
- javascript - 使用包含锚点 (#) 的 URL 强制重新加载页面