2017-08-13 8 views
1

内のすべての行を保つ他の因子のレベルによって集計値が、私はこのような構造を有するRにデータフレームを有するR

SiteID Unrelated AirMonitor WaterMonitor SoilMonitor 
1  A  dog   1   0   0 
2  A  cat   0   1   0 
3  A catamount   0   0   1 
4  B  bird   0   1   0 
5  B  horse   0   0   1 
6  C monkey   1   0   0 

1での存在を示しますそのサイトのそのタイプのモニター(モニタの列を必要に応じて"Y""N"の値に変更することができます)。基本的には、モニターの存在をSiteIDで集計したいが、Unrelated列のデータが失われないようにすべての行を保持したい。私は1の値を0の値よりも勝ちたいと思っています。たとえば、SiteID Aの行にAirMonitor1がある場合、SiteID Aのすべての行にAirMonitor1が必要です。他の2つのモニタータイプにも同じです。

所望の出力:

SiteID Unrelated AirMonitor WaterMonitor SoilMonitor 
1  A  dog   1   1   1 
2  A  cat   1   1   1 
3  A catamount   1   1   1 
4  B  bird   0   1   1 
5  B  horse   0   1   1 
6  C monkey   1   0   0 

実際のデータセットは、いくつかのより多くの無関係な列と行の数千を持っています。これを行うには簡単な方法が必要です(おそらくaggregate?で)。

答えて

3

通常、aggregateにして行をそのまま維持する場合は、aveが役立ちます。そこで、我々は、(最初​​の2を除く)の列をループにlapplyを使用してSiteID

df1[,-c(1:2)] = lapply(df1[,-c(1:2)], function(a) ave(a, df1$SiteID, FUN = max)) 
df1 
# SiteID Unrelated AirMonitor WaterMonitor SoilMonitor 
#1  A  dog   1   1   1 
#2  A  cat   1   1   1 
#3  A catamount   1   1   1 
#4  B  bird   0   1   1 
#5  B  horse   0   1   1 
#6  C monkey   1   0   0 
+1

ありがとうございました!私は 'c(" AirMonitor "、" WaterMonitor "、" SoilMonitor ")で置き換えた' -c(1:2) 'をどこにでも置いていました。 – rilkehayden

+1

'sapply'が行う単純化から行列へのプロセスを避けるためにおそらく' lapply'を使用します。 – thelatemail

2

dplyrを使用して最大値を計算するためにaveを使用します。

df1 %>% group_by(SiteID) %>% mutate_at(vars(-Unrelated), funs(max)) 
Source: local data frame [6 x 5] 
Groups: SiteID [3] 

    SiteID Unrelated AirMonitor WaterMonitor SoilMonitor 
    <fctr> <fctr>  <dbl>  <dbl>  <dbl> 
1  A  dog   1   1   1 
2  A  cat   1   1   1 
3  A catamount   1   1   1 
4  B  bird   0   1   1 
5  B  horse   0   1   1 
6  C monkey   1   0   0 

を別の方法として、あなたのような複数の変数を持っている場合Unrelatedと指定したくない場合は、次のように考えることができます。

df %>% group_by(SiteID) %>% mutate_if(is.numeric, funs(max)) 

これは、グループごとに各数値列にmaxを適用します。

関連する問題