[英]Aggregate values by levels of another factor but keep all rows in R
我在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的1
對AirMonitor
,我希望與所有行SiteID
一個有1
對AirMonitor
。 其他兩種監視器類型相同。
所需的輸出:
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
?)。
通常,如果您想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
使用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
應用於每個數字列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.