簡體   English   中英

按另一個因素的水平匯總值,但將所有行保留在R中

[英]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的1AirMonitor ,我希望與所有行SiteID一個有1AirMonitor 其他兩種監視器類型相同。

所需的輸出:

  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM