如何在R中高效选择最小值行?

4

可能是重复问题:
仅保留每个因子水平的最小值

这是我的问题,我想选择指定列中具有最小值的行。 例如:

df <- data.frame(A=c("a","a","b","b"),value=1:4)

我想要的结果是
 A value
 a     1
 b     3

我可以使用byddply,但是当数据框很大并且A中有许多不同的值时,它们会变得非常缓慢。

do.call(rbind,by(df,df$A, function(x) x[which.min(abs(x$value)),],simplify=FALSE))

ddply(df, ~A, function(x){x[which.min(abs(x$value)),]})

任何建议吗?
非常感谢!

我选择了那个可能的重复内容,因为它里面有一些基准测试。希望能对你有所帮助。 - Matt Dowle
顺便提一下,如果有一些搜索技巧的话,我是通过搜索“[r] +which.min +benchmark”找到那个问题的,只返回了那一个问题。我想诀窍在于从“高效”这个词转而搜索“基准测试”。 - Matt Dowle
2个回答

2

data.table如果设置键值,对于大型数据框的处理速度非常快。

dt <- data.table(df, key="A")
dt[, list(value=min(value)), by=A]

参考文献:


1
有趣。如何返回除了"value"和"A"以外的其他列? - ccshao
您可以通过将列名作为向量传递(例如 by=c("A", "Bcolumn", "Ccolumn"))来拥有多个“按”列。您可以在列表调用中包含多个统计信息(例如 list(min_value=min(value), max_value=max(value))),以计算多个统计数据。 - Erik Shilts
1
抱歉,我没有表达清楚。假设在数据框df中有三列“B”,但是使用该命令时只得到了“value”和“A”,如何使输出也包括列“B”。 - ccshao
这取决于你想要计算什么。如果你想要按A和B的最小值进行计算,那么你需要使用我上面提到的“by”语法。如果你想要在B上计算某些东西,那么你将使用“list”语法,但是将值替换为B。如果你想要其他内容,那么示例数据会有所帮助,因为语法将根据你想要的内容而有所不同。 - Erik Shilts

0

tapply做这个:

> tapply(df$value, df$A, min)
a b 
1 3 

编辑:使用by代替tapply,我们可以保留行名称:

df <- data.frame(A=c("a","a","b","b"),value=11:14)
df
##   A value
## 1 a    11
## 2 a    12
## 3 b    13
## 4 b    14

do.call(rbind, unname(by(df, df$A, function(x) x[x$value == min(x$value),])))
##   A value
## 1 a    11
## 3 b    13

它很快,但我丢失了其他信息。如何返回行索引? - ccshao
抱歉,我误读了您的问题。我以为您想要值(这里与索引相符)。 - Matthew Lundberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接