我正在尝试删除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),] )
如何调整重复行的删除?
谢谢!
答案 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),] )
反之,即保持较大的值order
与decreasing = TRUE