我在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
?)。
答案 0 :(得分: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 :(得分: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
应用于每个组的每个数字列。