R中重复行中的最大值

时间:2015-11-05 00:18:29

标签: r

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

3 个答案:

答案 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