2015-11-05 96 views
-1

我有一个数据集,包括ID,时间,年龄,v1,v2,v3等几个变量。 我需要替换重复的行(条件ID和时间);对于具有相同ID和时间的行,获取每个变量的最大值并将其替换为数据集(我需要保留所有重复行)。任何意见,将不胜感激。R中重复行的最大值

+3

请你自己尝试它 – rawr

回答

1

我的例子只有v1和v2,但你的想法...

> head(d) 
    ID Time Age v1 v2 
1 a 1 11 12 13 
2 a 1 21 12 53 
3 a 1 11 42 43 
4 b 1 4 6 7 
5 b 2 1 2 3 

这里我们会汇总得到最大

> agg = aggregate(
      list(Age=d$Age,v1=d$v1,v2=d$v2), 
      by=list(ID=d$ID,Time=d$Time), 
      FUN=max 
     ) 

> head(agg) 
    ID Time Age v1 v2 
1 a 1 21 42 53 
2 b 1 4 6 7 
3 b 2 1 2 3 

现在我们合并,与前两列我们的原始数据的

> merge(d[,c(1,2)],agg,by=c("ID","Time")) 
    ID Time Age v1 v2 
1 a 1 21 42 53 
2 a 1 21 42 53 
3 a 1 21 42 53 
4 b 1 4 6 7 
5 b 2 1 2 3 
+0

我喜欢这个概念,但你也许可以把它简化一点:'合并(DAT [C(” ID“,”Time“)],aggregate(。〜ID + Time,data = dat,FUN = max))' – thelatemail

2

使用dplyr

library(dplyr) 
your_data %>% 
    group_by(ID, time) %>% 
    mutate_each(funs = funs(max))) 

如果你有NA值,尝试

your_data %>% 
    group_by(ID, time) %>% 
    mutate_each(funs = funs(max(., na.rm = T))) 

快乐,以测试提供的任何数据/演示。

+0

我必须更新我的包......找不到'%>%'非常好。 – Larsenal

0

使用ave另一种选择,适用于@ Larsenal的示例数据:

idvars <- c("ID","Time") 
numvars <- setdiff(names(dat), idvars) 
dat[numvars] <- lapply(dat[numvars], function(x) ave(x, dat[idvars], FUN=max)) 

# ID Time Age v1 v2 
#1 a 1 21 42 53 
#2 a 1 21 42 53 
#3 a 1 21 42 53 
#4 b 1 4 6 7 
#5 b 2 1 2 3