我有一个数据集,包括几个变量,如ID,时间,年龄,v1,v 2,v3。 我需要替换重复的行(ID和时间条件);对于具有相同ID和时间的行,获取每个变量的最大值并将其替换为数据集(我需要保留所有重复的行)。任何建议将不胜感激。
答案 0 :(得分: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)))
很高兴对所提供的任何数据进行测试/演示。
答案 1 :(得分: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
答案 2 :(得分: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