[英]Max among duplicated rows in R
我有一個包含幾個變量的數據集,例如ID,Time,Age,v1,v 2,v3。 我需要替換重復的行(ID和時間的條件); 對於具有相同ID和時間的行,獲取每個變量的最大值,並將其替換為數據集(我需要保留所有重復的行)。 任何意見,將不勝感激。
使用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)))
很高興對提供的任何數據進行測試/演示。
我的示例只有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
另一種使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.