gpt4 book ai didi

r - 按组选择具有最小值的行

转载 作者:行者123 更新时间:2023-12-03 10:32:25 24 4
gpt4 key购买 nike

我遇到了一个困扰我一段时间的问题……希望这里的任何人都可以帮助我。

我得到以下数据框

f <- c('a','a','b','b','b','c','d','d','d','d')
v1 <- c(1.3,10,2,10,10,1.1,10,3.1,10,10)
v2 <- c(1:10)
df <- data.frame(f,v1,v2)

f 是一个因子; v1 和 v2 是值。
对于 f 的每个级别,我只想保留一行:在该因子级别中 v1 的值最低的那一行。
f   v1  v2
a 1.3 1
b 2 3
c 1.1 6
d 3.1 8

我用聚合、ddply、by、tapply 尝试了各种东西……但似乎没有任何效果。对于任何建议,我将不胜感激。

最佳答案

使用 DWin 的解决方案,tapply可以避免使用 ave .

df[ df$v1 == ave(df$v1, df$f, FUN=min), ]

这提供了另一个加速,如下所示。请注意,这也取决于级别的数量。我给出了这个,因为我注意到 ave虽然它是 R 中更强大的函数之一,但它经常被遗忘。
f <- rep(letters[1:20],10000)
v1 <- rnorm(20*10000)
v2 <- 1:(20*10000)
df <- data.frame(f,v1,v2)

> system.time(df[ df$v1 == ave(df$v1, df$f, FUN=min), ])
user system elapsed
0.05 0.00 0.05

> system.time(df[ df$v1 %in% tapply(df$v1, df$f, min), ])
user system elapsed
0.25 0.03 0.29

> system.time(lapply(split(df, df$f), FUN = function(x) {
+ vec <- which(x[3] == min(x[3]))
+ return(x[vec, ])
+ })
+ .... [TRUNCATED]
user system elapsed
0.56 0.00 0.58

> system.time(df[tapply(1:nrow(df),df$f,function(i) i[which.min(df$v1[i])]),]
+ )
user system elapsed
0.17 0.00 0.19

> system.time( ddply(df, .var = "f", .fun = function(x) {
+ return(subset(x, v1 %in% min(v1)))
+ }
+ )
+ )
user system elapsed
0.28 0.00 0.28

关于r - 按组选择具有最小值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4189807/

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