如何有效地选择R中具有最小值的行?

时间:2012-11-21 18:08:41

标签: r

  

可能重复:
  Only keep min value for each factor level

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

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

我想要的结果是

 A value
 a     1
 b     3

我可以使用byddply,但是当df很大且在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)),]})

有什么建议吗?

非常感谢!

2 个答案:

答案 0 :(得分:2)

如果设置密钥,

data.table对于大型data.frames来说非常快。

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

参考文献:

答案 1 :(得分: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