从R中的数据框中删除重复的行,保留那些具有更小/更大值的行

时间:2016-09-02 15:48:08

标签: r dataframe conditional

我正在尝试删除R数据框中的重复行,但我希望保留某个列中具有更小或更大值(不会出于此问题的目的)的行的条件。

我可以正常删除重复的行(从任何一侧),如下所示:

df = data.frame( x = c(1,1,2,3,4,5,5,6,1,2,3,3,4,5,6),
             y = c(rnorm(4),NA,rnorm(10)),
             id = c(rep(1,8), rep(2,7)))

splitID <- split(df , df$id)
lapply(splitID, function(x) x[!duplicated(x$x),] )

如何调整重复行的删除?

谢谢!

2 个答案:

答案 0 :(得分:2)

使用ave()返回逻辑索引以对data.frame

进行子集化
idx = as.logical(ave(df$y, df$x, df$id, FUN=fun))
df[idx,, drop=FALSE]

一些可能的fun包括

fun1 = function(x)
    !is.na(x) & !duplicated(x) & (x == min(x, na.rm=TRUE))

fun2 = function(x) {
    res = logical(length(x))
    res[which.min(x)] = TRUE
    res
}

这个的dplyr版本可能是

df %>% group_by(x, id) %>% filter(fun2(y))

答案 1 :(得分:1)

在应用order

之前,我们可能需要duplicated
lapply(splitID, function(x) x[!duplicated(x[order(x$x, x$y),]$x),] )

反之,即保持较大的值orderdecreasing = TRUE