2017-08-13 50 views
1

我在R A數據幀具有這種結構:集合值但保留所有行中的R

df1<-data.frame(SiteID=c("A","A","A","B","B","C"),Unrelated=c("dog","cat","catamount","bird","horse","monkey"),AirMonitor=c(1,0,0,0,0,1),WaterMonitor=c(0,1,0,1,0,0),SoilMonitor=c(0,0,1,0,1,0)) 

與輸出這樣的:

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的行具有1AirMonitor,我希望SiteID A的所有行對於AirMonitor具有1。其他兩種監視器類型也相同。

所需的輸出:

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可以提供幫助。所以,我們使用lapply遍歷列(除了前兩個),並使用ave通過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

我可能會使用'lapply'來避免'sapply'所做的簡化到矩陣的過程。 – thelatemail

2

使用dplyr計算最大值:

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

相關問題