2012-11-21 137 views
4

可能重复:
Only keep min value for each factor level如何有效地选择R中具有最小值的行?

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

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)),]}) 

有什么建议吗?

非常感谢!

+0

我选择了可​​能重复的,因为它有一些基准在里面。希望能帮助到你。 –

+0

顺便说一句,万一一些搜索技巧帮助,我发现这个问题通过搜索“[r] + which.min +基准”,它返回了单个问题。我想这个诀窍是从“高效”到搜索“基准”。 –

回答

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 
+0

速度很快,但我失去了其他信息。如何返回行索引? – shao

+0

对不起,我误解了你的问题。我以为你想要的价值(这里同意指数)。 –

2

data.table是大data.frames如果您设置密钥。

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

参考文献:

+1

有趣。如何返回其他列而不是“值”和“A”? – shao

+0

通过将列名称作为向量传递(例如'by = c(“A”,“Bcolumn”,“Ccolumn”)'),您可以有多个“by”列。你可以通过将它们包含在列表调用中来计算多个统计信息(例如'list(min_value = min(value),max_value = max(value))' –

+1

对不起,我没有弄清楚,假设有三列“B “,在df中,命令我只有”值“和”A“,如何输出”B“列 – shao

相关问题