根据第二列条件删除重复项

时间:2014-09-21 19:15:12

标签: r

我正在尝试根据不同列上的最大值删除数据框中的重复行

因此,对于数据框:

df<-data.frame (rbind(c("a",2,3),c("a",3,4),c("a",3,5),c("b",1,3),c("b",2,6),c("r",4,5))
  colnames(df)<-c("id","val1","val2")

id val1 val2

  a    2    3

  a    3    4

  a    3    5

  b    1    3

  b    2    6

  r    4    5

我想通过id删除所有重复项,条件是对于相应的行,它们没有val2的最大值。

因此数据框应该变为:

  a    3    5

  b    2    6

  r    4    5

- &GT;删除所有重复项但保留df $ val2的最大值的行为子集(df,df $ id ==“a”)

4 个答案:

答案 0 :(得分:7)

使用base R。这里的列是factors。请务必将其转换为numeric

 df$val2 <- as.numeric(as.character(df$val2))
 df[with(df, ave(val2, id, FUN=max)==val2),]
 #  id val1 val2
 #3  a    3    5
 #5  b    2    6
 #6  r    4    5

或使用dplyr

 library(dplyr)
 df %>% 
    group_by(id) %>% 
    filter(val2==max(val2))
 #   id val1 val2
 #1  a    3    5
 #2  b    2    6
 #3  r    4    5

答案 1 :(得分:6)

一种可能的方法是使用data.table

library(data.table)
setDT(df)[, .SD[which.max(val2)], by = id]
##    id val1 val2
## 1:  a    3    5
## 2:  b    2    6
## 3:  r    4    5

答案 2 :(得分:2)

以下是我希望您的数据真正设置的方式

df <- data.frame (id = c(rep("a", 3), rep("b", 2), "r"),
                  val1 = c(2, 3, 3, 1, 2, 4), val2 = c(3, 4, 5, 3, 6, 5))

您可以split - unsplit

> unsplit(lapply(split(df, df$id), function(x) {
      if(nrow(x) > 1) {
          x[duplicated(x$id) & x$val2 == max(x$val2),]
      } else {
          x
      }
  }), levels(df$id))
#   id val1 val2
# 3  a    3    5
# 5  b    2    6
# 6  r    4    5

您也可以使用Reduce(rbind, ...)do.call(rbind, ...)代替unsplit

答案 3 :(得分:0)

另一个

df %>% group_by(id) %>%
         slice(which.max(val2))

  id   val1  val2
   a    3     5
   b    2     6
   r    4     5