2015-04-05 108 views
2

我有以下數據:如何獲得一列中的最小值的行,按其他列分組,同時保留其他列?

df <- data.frame(A = c(1,2,3,4,5,6), B=c("P","P","P","Q","Q","Q"), C=c("a","b","c","d","e","f")) 
df 
##  A B C 
## 1 1 P a 
## 2 2 P b 
## 3 3 P c 
## 4 4 Q d 
## 5 5 Q e 
## 6 6 Q f 

欲某種方式得到與所述的每個不同的B中的最小值的行,而且還與在C.例如對應的值

##  A B C 
## 1 1 P a 
## 4 4 Q d 

我嘗試以下,但同樣沒有我想要的東西:

> aggregate(df[c('A')], by=df[c('B')], FUN=min) 
    B A 
1 P 1 
2 Q 4 
> aggregate(df[c('A')], by=df[c('B','C')], FUN=min) 
    B C A 
1 P a 1 
2 P b 2 
3 P c 3 
4 Q d 4 
5 Q e 5 
6 Q f 6 

回答

3

您可以嘗試

library(dplyr) 
df %>% 
    group_by(B) %>% 
    filter(A==min(A)) 
# A B C 
#1 1 P a 
#2 4 Q d 

或者

library(data.table) 
setDT(df)[, .SD[A==min(A)], B] 

或者使用base R

df[with(df, ave(A, B, FUN=min)==A),] 
# A B C 
#1 1 P a 
#4 4 Q d 
+0

謝謝!我最終使用了'dplyr'解決方案。但是:事實上,它爲一個組輸出多行,如果最小值出現多次,因爲我不想這樣做,所以我使用:'df%>%group_by(B)%>%filter(A == min (A))%>%distinct%(A)' – 2015-04-05 17:54:29

+0

@DimitriSchachmann如果你有關係並且需要第一個值,你也可以使用'which.min'即'df%>%group_by(B)%>%slice .min(B))' – akrun 2015-04-05 18:01:42

1

您還可以使用分割適用技術:

# split `df` on the field 'b' 
tmp <- split(df,df$B) 

# reduce to the row with the minimum value of A 
tmp <- lapply(tmp,function(x) 
       x[x$A == min(x$A),]) 

# bind the rows together 
do.call(rbind,tmp) 


#> A B C 
#> P 1 P a 
#> Q 4 Q d 
相關問題