2017-12-29 25 views
3

私は前に出会ったことのないユースケースを持っています。私は以下のデータフレームを持ち、条件 "i"の各レベルに対して "x"が最小値と最大値をそれぞれ達成する "y"の値を選択したいと思う。Xの値を持つ列Yの値をグループ化して取得する方法は?

正しいですが、私が代わりにその x Minまたは Maxある yを持っているしたいと思います
> library(dplyr) 
> df <- data.frame(i=c(1,1,2,2),x=c(1.0,2.0,3.0,4.0),y=c('a','b','c','d')) 
> ddply(df, .(i), summarise, Min=min(x), Max=max(x)) 
    i Min Max 
    1 1 2 
    2 3 4 

i Min Max 
    1 a b 
    2 c d 

どうすればいいですか?あなたがtidyverseの外に出ることを喜んでいる場合

答えて

3
 library(plyr) 
    df <- data.frame(i=c(1,1,2,2),x=c(1.0,2.0,3.0,4.0),y=c('a','b','c','d')) 
    ddply(df, .(i), summarise, Min=y[which.min(x)], Max=y[which.min(x)]) 
+0

と連結することができ、それは依存性やシンプルさの点では、私のOPユース・ケースに最も簡単な/最も近いので、私はこの1つが好きでした。 –

4

我々は別のオプションslice

library(dplyr) 
df %>% 
    group_by(i) %>% 
    slice(which.min(x)) %>% 
    #or 
    #slice(which.max(x)) %>% 
    select(-x) 
3

を使用することができますdata.table次のとおりです。

setDT(df)[, list(min = y[which.min(x)], 
       max = y[which.max(x)]), by = i] 

# i min max 
#1: 1 a b 
#2: 2 c d 
1

ベースRにおけるソリューション:

output <- by(df, df[, "i"], with, { 
    data.frame(i=i[1], min=y[which.min(x)], max=y[which.max(x)]) 
}) 

は(data.frame私が信じる "Y" の因子構造を維持するために必要である)

> output 
df[, "i"]: 1 
    i min max 
1 1 a b 
------------------------------------------------------------ 
df[, "i"]: 2 
    i min max 
1 2 c d 

を与えます。

出力はdo.call(rbind, output)

> do.call(rbind, output) 
    i min max 
1 1 a b 
2 2 c d 
関連する問題