2015-11-05 183 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