按另一个因子的级别聚合值,但将所有行保留在R中

时间:2017-08-13 21:41:43

标签: 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 A的所有行都有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?)。

2 个答案:

答案 0 :(得分:3)

通常,如果您想要aggregate并保持行不变,ave可以提供帮助。因此,我们使用lapply遍历列(前两个除外)并使用aveSiteID计算最大值

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 :(得分: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应用于每个组的每个数字列。