2017-08-13 52 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

相关问题