这是我的问题,我想在指定的列中选择值最小的行。 例如:
df <- data.frame(A=c("a","a","b","b"),value=1:4)
我想要的结果是
A value
a 1
b 3
我可以使用by
和ddply
,但是当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 :(得分: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