% arran-6ren">
gpt4 book ai didi

返回在 R 中建立 "closest value to"的行

转载 作者:行者123 更新时间:2023-12-01 16:22:38 30 4
gpt4 key购买 nike

我有一个具有不同 ID 的数据框,我想创建一个子组,其中:对于每个 ID,我只会获得变量 Y 中值最接近 0.5 的一行。

这是我的数据框:

df <- data.frame(ID=c("DB1", "BD1", "DB2", "DB2", "DB3", "DB3", "DB4", "DB4", "DB4"), X=c(0.04, 0.10, 0.10, 0.20, 0.02, 0.30, 0.01, 0.20, 0.30),
Y=c(0.34, 0.49, 0.51, 0.53, 0.48, 0.49, 0.49, 0.50, 1.0)
)

这就是我想要的

ID X Y
DB1 0.10 0.49
DB2 0.10 0.51
DB3 0.30 0.49
DB4 0.20 0.50

我知道我可以使用类似这样的东西添加带有 ddply 的过滤器

ddply(df, .(ID), function(z) {
z[z$Y == 0.50, ][1, ]
})

如果 Y 中始终有 0.50 的值,那么这种方法就可以正常工作,但事实并非如此。

如何将 == 更改为“最接近”0.5,或者是否有另一个我可以使用的函数?

提前谢谢您!

最佳答案

你需要计算与0.5的差值,然后保留最小的那个。一种方法是这样:

ddply(df, .(ID), function(z) {
z[abs(z$Y - 0.50) == min(abs(z$Y - 0.50)), ]
})

请注意,我在上面编码的方式省略了 [1, ],如果两行完全绑定(bind),则这两行都将被保留。

应该没问题,因为我们在 == 的两边进行完全相同的计算,但我经常担心数值精度问题,所以我们可以使用 which.min 。请注意,如果出现平局,which.min 将返回第一个最小值。

ddply(df, .(ID), function(z) {
z[which.min(abs(z$Y - 0.50)), ]
})

另一种可靠的方法是按 0.5 的差值对数据帧进行排序,并保留每个 ID 的第一行。此时,我将过渡到 dplyr,不过您当然可以使用 dplyrplyr::ddply 来实现这些方法中的任何一个。

library(dplyr)
df %>% group_by(ID) %>%
arrange(abs(Y - 0.5)) %>%
slice(1)

我不确定 arrange 如何处理关系。更多方法见Get rows with minimum of variable, but only first row if multiple minima ,并且始终使用 abs(Y - 0.5) 作为要最小化的变量。

关于返回在 R 中建立 "closest value to"的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41496276/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com