2016-04-08 6 views
0

データフレームを見て、最小の1つの列で新しいデータフレームを作成し、係数で分割するコードを記述しました。しかし、私は結果に他の列を組み込む方法を理解することができません(要因として使用することはありません)。aggregate()に追加の列を追加する

たとえば、次のコードでは、 "State"、 "Institution"、 "Rating1"、 "Rating2"、および "Junkdata"という列のデータフレームを作成します。次に、リストされた各状態について、評価1の最小値を求め、各状態ごとに最小値を持つデータフレームを作成します。しかし、私は "機関"の列を含めたいと言います。それ、どうやったら出来るの? 私もいくつかのプライヤーソリューションを使いましたが、サイコロはありませんでした。

「Institution」の列を指定せずに使用したコードはここにありますが、私はそれを私が成功することなく考えることができるあらゆる場所に置いてみてください。

##create the data frame 
State <- c("AZ","AZ","AZ","CA","CA","CA","CA","CA","NY","NY","NY","NY","SD","SD") 
Institution <- c("Institution 1","Institution 2","Institution 3","Institution 4","Institution 5","Institution 6","Institution 7","Institution 8","Institution 9","Institution 10","Institution 11","Institution 12","Institution 13","Institution 14") 
Rating1 <- c(3.4, 5.6,2.2,6.3,8.3,2.1,3.3,9.7,7.7,5.4,9.9,3.2,6.1,5.2) 
Rating2 <- c(8.4,3.4,6.5,2.5,7.5,4.2,5.6,8.3,4.9,3.3,1.1,8,7.7,3.3) 
Junkdata <- c("junk","more junk","superfluous","junk","more junk","superfluous","junk","more junk","superfluous","junk","more junk","superfluous","junk","more junk") 
data.df <- data.frame(State, Institution, Rating1, Rating2, Junkdata) 

## Use aggregate to find the minimum of Rating 1 for each State 
new.df <- aggregate(data.df$Rating1 ~ State, data.df, min) 

使用plyr:

library(plyr) 
new.df.2 <- ddply(new.df, .(State), summarise, min=min(data.df$Rating1)) 
+1

私はあなたが間違ったツールを使用していると思いますが(S) data.df [!! ave(data.df $ Rating1、data.df $ State、FUN = function(x)x == min(x))、1:3] '、' aggregate 'と' summarize'はデータの部分集合に対して計算を実行します。フィルタリングや集計/集計を行う場合でも、「min」は変更されないため、結果が同じであることは少し混乱します – rawr

+0

これも機能します!私は本当に二重の感嘆符が何をしているのか理解していない。平均、和などの使用に関しては、私がやろうとしていることの中では意味がありません。 – Thoughtcraft

+1

私が使った 'ave'は' c(0、1、0) 'などを返し、' !! c(0、1、0) 'はそれを単に論理値に変換します。またはas.logical(c(0、1、0))と等価ですが、もう一方の方が高速です。私は@akrunから取得しました – rawr

答えて

1

これはdplyrを経由して行うのは簡単です:

library(dplyr) 

resultDF <- data.df %>% 
    group_by(State) %>% 
    filter(Rating1 == min(Rating1)) 

トリックは、状態によってグループにあります。次に、フィルター操作を適用すると、各状態内のみが表示され、その状態内のすべてのRating1値のうち、Rate1が最小である行を選択します。コメントで質問に対して

あなただけの国、機関及びRating1を含めたい場合は、次のチェーン行うことができます。

resultDF <- data.df %>% 
    group_by(State) %>% 
    filter(Rating1 == min(Rating1)) %>% 
    select(State, Institution, Rating1) 
+0

これは改善ですが、 "Institution"だけでなく "Junkdata"の列を含める方法があります(私が望んでいない列を削除するために別の行を追加すると、しかしそれは扱いにくい)。 – Thoughtcraft

+0

@JamesHanks:私のリビジョンをご覧ください。特定の列を選択する方法を示します。また、これであなたの質問が解決された場合は、「チェックマーク」をクリックしてこの回答を解決済みとマークしてください(ポイントを割り当ててクレジットを与える方法です)。 – user1357015

+0

はい、そうでした!ありがとうございました! – Thoughtcraft

関連する問題